首页 > 代码库 > 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 看是否返回错误,没有返回错误说明连接成功
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。