gpt4 book ai didi

c - 为 connect() 函数设置超时 C 中的 tcp 套接字编程中断 recv()

转载 作者:可可西里 更新时间:2023-11-01 02:31:08 25 4
gpt4 key购买 nike

在我的程序中,如果服务器不可访问,连接功能会花费太多时间。所以我尝试使用 select() 给连接超时。现在的问题是,当我尝试使用 recvfrom() 从服务器接收数据时,出现错误“EAGAIN”。这是用于连接服务器并从服务器接收数据的代码。

int sock;
struct sockaddr_in addr;
int connectWithServer
{

int status;

struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 0;

addr.sin_port = htons(port);
sock = socket (AF_INET,SOCK_STREAM,0);
inet_pton(AF_INET,serverIP,&addr.sin_addr);

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

fcntl(sock, F_SETFL, O_NONBLOCK);

if ( (status = connect(sock, (struct sockaddr*)&addr, sizeof(addr))) == -1)
{
if ( errno != EINPROGRESS )
return status;

}
status = select(sock+1, NULL, &set, NULL, &timeout);

return status;
}


long int receiveResponse (void *response , unsigned int length)
{
socklen_t sockLen = sizeof(struct sockaddr);
long int received = recvfrom(sock, response, length, 0,(struct sockaddr *)&addr, &sockLen);
printf("Received %ld bytes... err %d\n",received, errno);

return received;
}

最佳答案

Setting time out for connect() function tcp socket programming in C is not working

更正。设置连接超时工作。 “不起作用”的是随后的 recvfrom(),那是因为您让套接字处于非阻塞模式并且您不知道如何处理生成的 EAGAIN。 因此,要么通过使用 select() 告诉您套接字何时准备好读取来处理该问题,要么在完成连接后将套接字重新置于阻塞模式。

关于c - 为 connect() 函数设置超时 C 中的 tcp 套接字编程中断 recv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14254061/

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