gpt4 book ai didi

c - 选择在 Linux 上超时之前返回的调用

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:15 25 4
gpt4 key购买 nike

我开始讨厌套接字了,请帮忙。

所以我正在尝试连接到本地主机网络中的某个位置。这可能在线也可能不在线。因为我想等待比默认值更短的超时,所以我使用非阻塞 connect,+ select

struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(0x7f000001);
address.sin_port = htons(port);

const int timeout_int = 100; //in milliseconds
struct timeval timeout = { 0, timeout_int * 1000 };

SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

#ifdef WIN32
u_long iMode = 1;
ioctlsocket(s, FIONBIO, &iMode);
#else
int socketFlags = fcntl( s, F_GETFL, 0 )
socketFlags |= O_NONBLOCK;
fcntl( s, F_SETFL, socketFlags )
#endif

connect(s, (struct sockaddr*) clientService, sizeof(struct sockaddr_in));

fd_set sock;
FD_ZERO(&sock);
FD_SET(s, &sock);

int result = select(s + 1, NULL, &sock, NULL, &timeout);

当然还有很多我遗漏的错误检查;但别担心,我正在做,一切看起来都非常健康,除了它已经死了,可以这么说。

在 Windows 上它工作:它等待超时,如果没有找到任何东西,它返回 0 到 result,这恰好意味着“超时”。

然而,在完全相同的情况下,Linux 几乎立即返回 1 - 这意味着套接字已准备好写入!事实上,套接字标志仍然设置。

现在,有人建议我这样做

int soError;
socklen_t len = sizeof(soError);
getsockopt(s, SOL_SOCKET, SO_ERROR, (char*)&soError, &len);

那么只有当soError0时,连接才成功。

但是为什么没有等待超时呢?我能相信 Linux 知道如果我到了那个地步,就已经没有希望得到答案了吗?我试过在超时的剩余时间里 sleep ,然后再次检查;但在那种情况下,我在所有情况下都会得到 soError == 0,所以它不起作用。

还是我在其他时候做错了什么?

最佳答案

并非所有连接错误都需要超时。例如,ECONNREFUSED 会立即导致失败。超时是针对对等方根本没有响应的情况。

关于c - 选择在 Linux 上超时之前返回的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42701820/

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