【发布时间】:2011-03-21 16:25:38
【问题描述】:
我有一些使用 C 语言中的 Berkeley 套接字 API 进行套接字编程的经验。通常,任何套接字编程都需要一种策略,使接收套接字知道它应该接收多少数据。这可以通过标题长度字段或分隔符来完成。一般来说,我更喜欢包含长度的标题字段。
当然,我们也需要知道长度头域本身的大小,它只是一个固定的大小值,必须由发送者和接收者双方商定。在 C 中,这很容易实现,因为原生整数类型是固定大小的二进制格式,所以你可以这样说:
uint16_t bytes_to_receive;
recv(sock, &bytes_to_receive, sizeof(bytes_to_receive), 0);
bytes_to_receive = ntohs(bytes_to_receive);
// Now receive 'bytes_to_receive' bytes...
但是这种习惯用法是如何使用 Python 套接字完成的呢?在 Python 中,整数是对象,而腌制整数是可变长度的字节数组。所以我们不能使用腌制整数作为长度头字段,因为我们无法确定它的大小(以字节为单位)。
当然,我总是可以发送一个包含二进制整数的已知大小的字节数组,例如b'\x05\x00',以创建一个值为 5 的小端格式的 16 位二进制整数,但这似乎并不喜欢正确的方法。
那么,这在 Python 中通常是如何完成的呢?
【问题讨论】: