使用AF_UNIX套接字的双向通信
我想用 AF_UNIX
套接字来实现一下 Python官方文档中关于套接字模块的例子,而不是用 AF_INET
。所以现在服务器的代码看起来是这样的:
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 个回答
4
SOCK_STREAM是一种有状态的套接字类型,这意味着任何连接都必须先由一个正在监听的套接字确认,然后才会使用新的动态套接字(连接)来发送和接收数据。你不能直接从监听套接字接收数据。
简单来说,你忘了在绑定套接字后调用 sock.listen()
,然后需要用 connection, address = sock.accept()
这行代码来等待连接建立,这个过程会一直阻塞,直到有连接建立,然后它会返回一个包含新套接字(连接)和客户端地址的元组。之后你就可以使用 connection.recv()
来接收数据了。这种方式适用于UNIX套接字和TCP/IP套接字。
例如,你可以在 这里 查看一个示例。