为SO_RCVTIMEO,SO_SNDTIMEO

时间:2018-06-06 14:58:23

标签: python sockets setsockopt

需要将哪些值传递给Python socket.setsockopt()以设置读取或写入超时(即SO_RCVTIMEOSO_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_tsuseconds_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包大小。

0 个答案:

没有答案