需要将哪些值传递给Python socket.setsockopt()
以设置读取或写入超时(即SO_RCVTIMEO
,SO_SNDTIMEO
)?
我知道某些操作系统平台的答案,但我们需要涵盖Windows,OS-X和Linux,适用于32位和64位操作系统以及支持的Python运行时(包括混合)。
这是我们目前认为应该使用的内容:
OS OS size Py size setsockopt() value value size
---------------------------------------------------------------------
Linux 32-bit 32-bit struct.pack('II', sec, usec) 8 Bytes
Linux 64-bit 64-bit struct.pack('LL', sec, usec) 16 Bytes
OS-X 32-bit 32-bit struct.pack('II', sec, usec) 8 Bytes
OS-X 64-bit 64-bit struct.pack('LL', sec, usec) 16 Bytes
Windows 32-bit 32-bit struct.pack('l', msec) 4 Bytes?
Windows 64-bit 32-bit struct.pack('l', msec) 4 Bytes?
Windows 64-bit 64-bit struct.pack('l', msec) 4 Bytes?
其中sec
为秒,usec
为微秒,msec
为毫秒。
我的问题是:这种平台和比特大小的setsockopt()
值是否正确?
一些参考资料:
Python 2.7 socket description提供了socket.setsockopt()
的平台依赖关系的提示:
"各种与套接字相关的系统调用的特定于平台的参考资料也是有关套接字语义细节的宝贵信息来源。对于Unix,请参阅手册页;对于Windows,请参阅WinSock(或Winsock 2)规范。"
C / C ++的Linux手册页setsockopt()非常一致地指定使用struct timeval
作为超时选项,定义如下:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
time_t
和suseconds_t
的大小因操作系统类型及其位大小而异。
SO_RCVTIMEO的Windows documentation of setsockopt州:
"阻止接收呼叫的超时(以毫秒为单位)。"
并指定该值的DWORD大小。
在所有Windows位变体和位大小(?)
上,DWORD的大小似乎是32位长签名请注意,Windows还定义了一个struct timeval
,其成员与Linux上的成员相同(尽管具有不同的类型),但它似乎不会用于超时的C / C ++ setsockopt()。
Stackoverflow回答https://stackoverflow.com/a/47189930/1424462指出64位和32位的不同Python包大小。