我正在构建一个将请求发送到服务器的应用程序,并且需要实现一种方法来控制尝试将connect()连接到服务器的时间。

我想在十秒钟后结束connect()函数。我已经了解了select()和非阻塞套接字,但是我不完全了解它是如何工作的。

有人可以给我一个非常简单的例子来说明如何做到这一点吗?使用C。谢谢。

另外,我还要向send和recv函数添加相同的超时。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <errno.h>

int main(void) {

struct sockaddr_in server;
int sockfd;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

server.sin_addr.s_addr = inet_addr("10.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(atoi("80"));

fcntl(sockfd, F_SETFL, O_NONBLOCK);

struct timeval tv;
fd_set writefds;

tv.tv_sec = 5;
tv.tv_usec = 500000;

FD_ZERO(&writefds);
FD_SET(sockfd, &writefds);

connect(sockfd, (struct sockaddr *)&server, sizeof(server));

if (errno == EINPROGRESS)
{
        printf("In progress");
}

select(sockfd+1, NULL, &writefds, NULL, &tv);


您能解释为什么直到超时后才显示errno的if条件吗?这对我来说没有意义。还有其他任何代码我都应该在这里研究以正确处理。谢谢。

最佳答案

与其编写实际的代码,不如给我一个概述。 (我假设Linux或类似的东西。)


创建套接字。
在套接字fd上调用fcntl并设置
O_NONBLOCK选项使套接字无阻塞。 (您可能也
通过在SOCK_NONBLOCK上提供socket选项可以做到这一点
呼叫。)
呼叫connect。它将立即返回。它会最
可能“失败”,并显示错误EINPROGRESS,这意味着
连接操作正在进行中。
呼叫selectpoll等待
使套接字fd可写。这些电话都有一个
超时选项。
如果套接字可写(即您的selectpoll
(没有超时),请通过致电检查连接状态
getsockopt以获取SO_ERROR的值,这将指示
connect是通过返回错误代码成功还是失败
或0表示成功。


您也可以使用相同的技术来使sendrecv超时(尽管要进行接收,您需要等待套接字变得可读)。

有关更多信息,请参见以下手册页:socket(2),connect(2),select(2),poll(2),socket(7),getsockopt(2)。

关于c - 有人可以告诉我一个connect()函数的自定义超时的示例吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36961685/

10-16 22:27