gpt4 book ai didi

linux - 在 python3 中设置 SO_RCVTIMEO 套接字选项

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:43 31 4
gpt4 key购买 nike

我想知道 socket.setdefaulttimeout 是否设置了 SO_RCVTIMEOSO_SNDTIMEO 套接字选项,所以我尝试了这个:

import socket
socket.setdefaulttimeout(0.1) # 100 milliseconds
c = socket.socket()
x = c.getsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, 16)
# I think SO_RCVTIMEO uses a struct of two 8 byte ints,
# the first being an amount of time in second and the
# second an amount of time in milliseconds. So, I expect
# x[8:] to be a little endian 8-byte int equal to 100.
print(x)
# this outputs a 16 bytes of 0.

所以 python 的 socket.setdefaulttimeout 没有像我预期的那样工作。所以,我尝试自己设置 SO_RCVTIMEO:

import socket
c = socket.socket()
c.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, (0).to_bytes(8, 'little') + (100).to_bytes(8, 'little'))
print(c.getsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, 16))
# The first 8 bytes are 0 as expected, but the last eight bytes as an int
# is 4000, and not 100!

有谁知道为什么getsockopt返回的值和我用setsockopt设置的值不一样?我使用的是 Ubuntu 14.04.1,我在第 7 节中查看了套接字的手册页,但我无法弄清楚我做错了什么。我知道当您设置 SO_RCVBUF 时,操作系统会将您指定的大小加倍。这里有类似的事情吗?我不希望我的套接字阻塞 4 秒。

最佳答案

因此,我编写了一个小 C 脚本来打印 timeval 结构的大小并验证它是否为 16 字节长:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

int
main(int argc, char* argv[]){
printf("size of struct timeval: %d\n", sizeof(struct timeval));
return 0;
}

打印 size of struct timeval: 16。所以我搜索了 struct timeval 并发现成员是秒数和 秒数,而不是毫秒数。这意味着我试图将超时设置为 100 微秒,而操作系统的最小超时为 4 毫秒。哎呀!为了检查这是正确的,我编写了这个 python3 脚本:

import socket
c = socket.socket()
### this time use 100,000 microseconds (100 milliseconds)
c.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, (8*b'\x00')+(100000).to_bytes(8, 'little'))
x = c.getsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, 16)
print('socket timeout seconds:', int.from_bytes(x[:8], 'little'))
print('socket timeout microseconds:', int.from_bytes(x[8:], 'little'))
### OUTPUT
# socket timeout seconds: 0
# socket timeout microseconds: 100000

关于linux - 在 python3 中设置 SO_RCVTIMEO 套接字选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26224971/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com