使用AF_UNIX插座进行双向通信

时间:2014-07-13 09:14:27

标签: python sockets

我想使用AF_UNIX套接字而不是AF_INET来实现python official documentation on socket module中的示例。以下是服务器代码的现状:

import socket
import os

filename = '/tmp/mysock'
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
if os.path.exists(filename):
    os.remove(filename)
sock.bind(filename)
while 1:
    data = sock.recv(1024)
    print 'Received', repr(data)
    if not data:
        break
    sock.sendall(data)
sock.close()

当我运行它时,我明白了:

Traceback (most recent call last):
  File "/home/somecode/server.py", line 10, in <module>
    data = sock.recv(2048)
socket.error: [Errno 22] Invalid argument

1 个答案:

答案 0 :(得分:4)

SOCK_STREAM是一种有状态套接字类型,因此任何连接必须首先由侦听套接字确认,然后使用新的动态套接字(连接)进行发送和接收。你不能只是从监听套接字接收。

基本上你忘了在绑定后调用socket上的sock.listen()connection, address = sock.accept(),它会阻塞直到建立连接,然后返回带有新套接字(连接)和客户端地址的元组。然后只需使用connection.recv()。这对于UNIX套接字和TCP / IP套接字是通用的。

例如,看看here