【发布时间】:2019-11-24 09:28:42
【问题描述】:
我正在尝试通过 Windows 10 64 位中的 UNIX 套接字在 python 和 C++ 之间进行通信。
根据文档,要使用 UNIX 套接字,我需要将系列设置为 AF_UNIX 而不是 AF_INET,并创建一个临时的本地套接字。自去年以来,这似乎在 Windows 中是可能的,但我还没有找到关于如何做到这一点的明确解释。
我目前有这个设置:
服务器 python
HOST = '127.0.0.1'
PORT = 5555
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
# Do something with recv(), send()
....
客户端 C++
WSADATA WSAData;
SOCKET server;
SOCKADDR_IN addr;
WSAStartup(MAKEWORD(2,0), &WSAData);
server = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_family = AF_INET;
addr.sin_port = htons(5555);
connect(server, (SOCKADDR *)&addr, sizeof(addr));
// Do something with recv(), send()
由于这种通信对于我的目的来说非常慢,所以我想做同样的事情,但使用 UNIX 套接字。我怎样才能做到这一点?谢谢
【问题讨论】:
-
我知道 Unix 套接字不是用 ip 地址 + 端口表示的,但我不知道如何在 C++ 和 python 中正确表示它们。我写的例子与 AF_INET 家族有关
-
在 unix/linux 上,对于 unix 域套接字,
socket.bind和socket.connect的参数只是提供套接字文件路径名的字符串。我最初会尝试(使用适当的 Windows 路径名),可能类似于:s.bind("c:\\temp\\foo.sck") -
此外,Windows 似乎支持“抽象”命名空间。这是一个空字符,后跟一个不会出现在文件系统中的任何地方的名称,例如:
s.bind("\x00foo")