gpt4 book ai didi

c - 在 UNIX 域套接字上设置 connect() 超时

转载 作者:行者123 更新时间:2023-11-30 16:36:58 25 4
gpt4 key购买 nike

使用alarm()是在unix域套接字上设置connect()超时的唯一方法吗?我尝试过 select() ,描述为 here但似乎 select() 每次都会立即在 unix 域套接字上返回 ok 调用 getsockopt(SO_ERROR) 时没有发生错误,但 fd 上的 send() 返回错误,指出传输端点未连接。我粘贴下面的 select() 代码。

我认为使用警报可以满足这种情况,但似乎它被认为是一种老式的方式。所以我来这里看看是否还有其他解决方案。提前致谢。

if ((flags = fcntl(fd, F_GETFL, 0)) == -1) {
syslog(LOG_USER|LOG_ERR, "fcntl get failed: %s", strerror(errno));
close(fd);
return -1;
}
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
syslog(LOG_USER|LOG_ERR, "set fd nonblocking failed: %s", strerror(errno));
close(fd);
return -1;
}
if(connect(fd, (struct sockaddr *) &address, sizeof(struct sockaddr_un)) != 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EINPROGRESS) {
close(fd);
return -1;
}
FD_ZERO(&set);
FD_SET(fd, &set);
if(select(fd + 1, NULL, &set, NULL, &timeout) <= 0) {
close(fd);
return -1;
}
/*
if(connect(fd, (struct sockaddr *) &address, sizeof(struct sockaddr_un)) != 0) {
close(fd);
return -1;
}
*/
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len) < 0) {
syslog(LOG_USER|LOG_ERR, "getsockopt failed: %s", strerror(errno));
close(fd);
return -1;
}
if(error != 0) {
syslog(LOG_USER|LOG_ERR, "getsockopt return error: %d", error);
close(fd);
return -1;
}
}
if (fcntl(fd, F_SETFL, flags & ~O_NONBLOCK) == -1) {
syslog(LOG_USER|LOG_ERR, "set fd blocking failed: %s", strerror(errno));
close(fd);
return -1;
}

最佳答案

在另一篇文章中的某个地方(我没有为该页面添加书签)我发现 connect() 仅建立 TCP 连接。它仅意味着在另一端有一个正在工作的 TCP 堆栈,但并不意味着服务器实际上已经 accept()-ed!

connect() 的例子就像调用支持中心,自动语音告诉你,你在队列中,但你仍然无法沟通。 accept() 是接听您电话的实际运算符(operator)。

我对同一问题的解决方案是让客户端等待服务器实际发送一些内容,然后再继续处理其他客户端内容。我可以将其放入选择超时循环中。

listen() 有一个参数,表示在开始删除客户端连接尝试之前可以积压多少个连接。

关于c - 在 UNIX 域套接字上设置 connect() 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48222690/

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