C 和 Python 之间的 Unix 套接字

Unix sockets between C and Python

刚刚制作了一个 Python 程序作为 Unix 套接字的服务器,当它接收到连接时,从中读取 4 个字节。

另一方面,我制作了一个连接到服务器并将这 4 个字节发送给它的 C 程序。

file.py

packet = connection.recv(4, socket.MSG_WAITALL)
for value in packet:
    if value == '[=11=]':
        print 'A none'
    else:
        print value

file.c

size_t toSend 84; // Char representation [=12=][=12=][=12=]T
write(fd, (void *)&toSend, sizeof(toSend));

这使得 python 程序接收到错误的字节顺序。这里输出

T
A none
A none
A none

我首先想到的是这是字节顺序的结果,但后来我修改了文件,让它们变成这样。

file.c

char abc[16]; 
// setting char abc to be 'ABCDEFGHIJKLMNOP' (without ending [=14=])
write(fd, (void *)&abc[0], 16);

file.py

packet = connection.recv(16, socket.MSG_WAITALL)
// everything else, wasn't modified

这打印了:

A
B
C
...
P

所以这次是按预期收到的。有人可以指出我做错了什么吗?除非和size_t类型有关系,否则我想不出别的了。

谢谢!

这正是字节顺序。单个字节的位总是以相同的顺序排列,但一个字中的字节顺序可能不同。首先你发送一个由 4 个字节组成的单词,它们以相反的顺序(即大端)接收,但是在第二个例子中你是逐字节发送你的消息。

这实际上与 Python 无关,与套接字无关,但你是对的,它确实与字节顺序有关。

测试你的隐含假设:84 在你的 运行 C 客户端程序的计算机上真的表示为 0x00 0x00 0x 00 0x54 吗?尝试写入文件而不是套接字,然后二进制编辑结果。我打赌你会看到你的原生架构是小端的,写入的数据是 0x54 0x00 0x00 0x00.

您在套接字上看到的就是您发送的内容。