我想使用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
答案 0 :(得分:4)
SOCK_STREAM是一种有状态套接字类型,因此任何连接必须首先由侦听套接字确认,然后使用新的动态套接字(连接)进行发送和接收。你不能只是从监听套接字接收。
基本上你忘了在绑定后调用socket上的sock.listen()
和connection, address = sock.accept()
,它会阻塞直到建立连接,然后返回带有新套接字(连接)和客户端地址的元组。然后只需使用connection.recv()
。这对于UNIX套接字和TCP / IP套接字是通用的。
例如,看看here。