使用AF_UNIX套接字的双向通信

1 投票
1 回答
2067 浏览
提问于 2025-04-18 13:07

我想用 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套接字。

例如,你可以在 这里 查看一个示例。

撰写回答