在我的程序中,如果服务器不可达,connect函数需要太长时间。因此,我尝试使用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;
}
recvfrom
和connect
不匹配。前者用于UDP套接字,而后者与TCP相关。 - Davide Berra