在我的程序中如果无法访问服务器,则连接功能会花费太多时间.所以我尝试使用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 …Run Code Online (Sandbox Code Playgroud) ***背景****我是TCP的新手,所以我的问题可能有点基础.我试图在接收数据的套接字上打开O_NONBLOCK.到目前为止,我尝试了不同的方法来设置O_NONBLOCK,itcl()和fcntl().现在我想让fcntl()工作.
我的问题:您是否应该在连接套接字之前或之后设置O_NONBLOCK?
**我当前的fcntl()实现基于代码之前的链接:
//set socket to NONBlocking
on = fcntl(Socket,F_GETFL);
on = (on | O_NONBLOCK);
if(fcntl(Socket,F_SETFL,on) < 0)
{
perror("turning NONBLOCKING on failed\n");
}
// DO CONNECT
rc = connect()
Run Code Online (Sandbox Code Playgroud)
感谢您抽出宝贵时间来看看这个