首页 > 代码库 > fcntl设置无阻塞的超时连接

fcntl设置无阻塞的超时连接

场景描述:采用fcntl函数设置无阻塞套接字,尝试连接远程服务器,连接的时候出现如下的错误:

 if(fcntl(sock, F_SETFL, O_NONBLOCK) == -1)
   return -1;

 printf("Connect return retval = %d,sock =%d\n",retval,sock);
    retval = connect(sock, (struct sockaddr *)&edpinfo->servAddr, sizeof(struct sockaddr));
    perror("connect");
我先查了一下Operation now in progress是socket的阻塞了,要把socket设置成非阻塞模式,其实我也不是很明白fcntl这个函数的作用,但是从O_NONBLOCK来看,这个应该是把socket 设置成非阻塞模式了,

问题的根源在于:调用连接函数,但是没有等待返回,而是采用select套接字,等待连接的返回,如果在超时的时间内没有返回证明连接时失败。

正确的解决方案:

这是正常现象, EINPROGRESS说明非阻塞connect正在进行中,不算错误,接下来应该select检查socket的写事件,一旦写事件返回,那么getsockopt SOL_SOCKET + SO_ERROR 看是否返回错误,没有返回错误说明连接成功