Search on the blog

2016年8月23日火曜日

INETドメインとUNIXドメイン

ソケットには、INETドメインソケットとUNIXドメインソケットが存在する。

INETドメイン
異なるマシンで動作しているプロセス間の通信を行うためのソケット。

UNIXドメイン
同じマシン内で動作しているプロセス間の通信を行うためのソケット。
INETドメインソケットでもループバックアドレスを利用することで同一マシン内の通信はできるが、UNIXドメインソケットの方が高速である。

INETドメインソケットのサンプル

inet_server.py

bindするときにIP、PORTを指定する。

import socket

IP = '127.0.0.1'
PORT = 5005
BUFFER_SIZE = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((IP, PORT))
s.listen(1)
conn, addr = s.accept()
while 1:
 data = conn.recv(BUFFER_SIZE)
 if not data:
  break
 msg = data.decode('utf-8')
 msg = msg[::-1]
 conn.send(msg.encode('utf-8'))
conn.close() 

inet_client.py

import socket

IP = '127.0.0.1'
PORT = 5005
BUFFER_SIZE = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, PORT))
msg = "ABCDEFG"
s.send(msg.encode('utf-8'))
data = s.recv(BUFFER_SIZE)
print (data.decode('utf-8'))
s.close()

プロセスIDからINETドメインソケットを調べる。
$ ps -ef | grep python
  501  9165  2011   0 11:51PM ttys000    0:00.04 python inet_server.py
$ lsof -n -i -P | grep 9165
python3.5  9165 kenjih    3u  IPv4 0xf27949601620cf2b      0t0  TCP 127.0.0.1:5005 (LISTEN)

UNIXドメインソケットのサンプル

unix_server.py

bindするときにファイル名を指定する。
UNIXドメインソケットでは、アドレス・名前空間としてファイルシステムを使用する。

import socket
import os

PATH = '/tmp/sample.sock'
BUFFER_SIZE = 1024

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
os.unlink(PATH)
s.bind(PATH)
s.listen(1)
conn, addr = s.accept()
while 1:
 data = conn.recv(BUFFER_SIZE)
 if not data:
  break
 msg = data.decode('utf-8')
 msg = msg[::-1]
 conn.send(msg.encode('utf-8'))
conn.close() 

unix_client.py

import socket

PATH = '/tmp/sample.sock'
BUFFER_SIZE = 1024

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(PATH)
msg = "ABCDEFG"
s.send(msg.encode('utf-8'))
data = s.recv(BUFFER_SIZE)
print (data.decode('utf-8'))
s.close()

プロセスIDからUNIXドメインソケットを調べる。
$ ps -ef | grep python     
  501 11543  2011   0 12:02AM ttys000    0:00.04 python unix_server.py
$ lsof -n -P -U | grep 11543
python3.5 11543 kenjih    3u  unix 0xf279496017547fcb      0t0      /tmp/sample.sock

0 件のコメント:

コメントを投稿