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
.
您在套接字上看到的就是您发送的内容。
刚刚制作了一个 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
.
您在套接字上看到的就是您发送的内容。