Unix domain socket 或者 IPC socket是一種終端,可以使同一臺操作系統(tǒng)上的兩個或多個進程進行數(shù)據(jù)通信捺檬。與管道相比再层,Unix domain socket 既可以使用字節(jié)流,又可以使用數(shù)據(jù)隊列堡纬,而管道通信則只能使用字節(jié)流聂受。Unix domain socket的接口和Internet socket很像,但它不使用網(wǎng)絡底層協(xié)議來通信隐轩。Unix domain socket 的功能是POSIX操作系統(tǒng)里的一種組件饺饭。
Unix domain socket 使用系統(tǒng)文件的地址來作為自己的身份。它可以被系統(tǒng)進程引用职车。所以兩個進程可以同時打開一個Unix domain sockets來進行通信瘫俊。不過這種通信方式是發(fā)生在系統(tǒng)內核里而不會在網(wǎng)絡里傳播°擦椋【from wiki】
如果從編程的角度來看扛芽,Unix domain socket和TCP/IP之間有兩個重要的不同。第一點积瞒,socket的地址是文件路徑川尖,而不是一個包含ip和端口的元組。其次茫孔, 在文件系統(tǒng)創(chuàng)建的代表socket的文件在socket關閉后依然存在叮喳,并且需要在每次服務器啟動時刪除被芳。
server.py
import socket
import sys
import os
SERVER_PATH = './uds_socket'
# Make sure the socket does not already exist
if os.path.exists(SERVER_PATH):
os.remove(SERVER_PATH)
print >>sys.stderr ,'starting unix domain socket server'
# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# Bind the socket to the port
sock.bind(SERVER_PATH)
# Listen for incoming conns
sock.listen(2)
print >>sys.stderr, 'Listening on path: %s' % SERVER_PATH
while True:
conn, addr = sock.accept()
try:
while True:
data = conn.recv(1024)
if data:
print >>sys.stderr, 'received [%s]' % data
conn.sendall(data)
else:
break
except Exception,e:
print e
finally:
conn.close()
client.py
import socket
import sys
# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# Connect the socket to the port where the server is listening
server_address = './uds_socket'
print >>sys.stderr, 'connecting to %s' % server_address
try:
sock.connect(server_address)
except socket.error, msg:
print >>sys.stderr, msg
sys.exit(1)
try:
# Send data
message = 'This is the message, This will be echoed back'
print >>sys.stderr, 'sending [%s]' % message
sock.sendall(message)
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected:
data = sock.recv(1024)
amount_received += len(data)
print >>sys.stderr, 'received [%s]' % data
finally:
print >>sys.stderr, 'closing socket'
sock.close()