必威体育Betway必威体育官网
当前位置:首页 > IT技术

非阻塞情况下connect产生EINPROGRESS错误

时间:2019-06-21 07:40:00来源:IT技术作者:seo实验室小编阅读:66次「手机版」
 

einprogress

今天在开发游戏客户端测试程序时,由于出现很多客户端,经过connect成功后,代码卡在recv系统调用中,后来发现可能是由于socket默认是阻塞模式,所以会令很多客户端

链接处于链接却不能传输数据状态。

后来修改socket为非阻塞模式,但在connect的时候,发现返回值为-1,刚开始以为是connect出现错误,但在服务器上看到了链接是ESTABLISED状态。证明链接是成功的

但为什么会出现返回值是-1呢? 经过查询资料,以及看stevens的APUE,也发现有这么一说。

当connect在非阻塞模式下,会出现返回-1值,错误码einprogress,但如何判断connect是联通的呢?stevens书中说明要在connect后,继续判断该socket是否可写?

若可写,则证明链接成功。如何判断可写,有2种方案,一种是select判断是否可写,二用poll模型

select:

int CheckConnect(int iSocket)

{

fd_set rset;

FD_ZERO(&rset);

FD_SET(iSocket, &rset);

timeval tm;

tm. tv_sec = 0;

tm.tv_usec = 0;

if ( select(iSocket + 1, NULL, &rset, NULL, &tval) <= 0)

{

close(iSocket);

return -1;

}

if (FD_ISSET(iSocket, &rset))

{

int err = -1;

socklen_t len = sizeof(int);

if ( getsockopt(iSocket,  SOL_SOCKET, SO_ERROR ,&err, &len) < 0 )

{

close(iSocket);

printf("errno:%d %s\n", errno, strerror(errno));

return -2;

}

if (err)

{

errno = err;

close(iSocket);

 

return -3;

}

}

return 0;

}

poll:

int CheckConnect(int iSocket) {
	struct pollfd fd;
	int ret = 0;
	socklen_t len = 0;

	fd.fd = iSocket;
	fd.events = POLLOUT;

	while ( poll (&fd, 1, -1) == -1 ) {
		if( errno != EINTR ){
			perror("poll");
			return -1;
		}
	}

	len = sizeof(ret);
	if ( getsockopt (iSocket, SOL_SOCKET, SO_ERROR, &ret, &len) == -1 ) {
    	        perror("getsockopt");
		return -1;
	}

	if(ret != 0) {
		fprintf (stderr, "socket %d connect failed: %s\n",
                 iSocket, strerror (ret));
		return -1;
	}

	return 0;
}

相关阅读

网站建设应该避免哪些错误

  越来越多的企业开始对网站建设进行大力度的投入,通常情况下要通过网站在短时间里见到经营的效果是比较难的。如果因为不合规定

@RequestBody,415Unsupported Media Type错误,真正有用

用了一上午查找问题解决方案,网上的试验了一遍都没用,最后终于解决~我的答案在最后 问题:前端传json,后端也返回json,出现格式不匹配报

nginx 502 Bad Gateway错误可能原因及解决方法

用是lnmp,参考: https://lnmp.org/faq/lnmp-Nginx-502-Bad-Gateway.html  本人是第九种原因,解决了

程序段错误

内存、指针相关 当程序运行出现退出错误为以下任意:(xxxxxxxxxx为地址) free():invalid pointer: xxxxxxxxx   malloc(): memor

centOS 7下无法启动网络(service network start)错误解

   今天在centOS 7下更改完静态ip后发现network服务重启不了,翻遍了网络,尝试了各种方法,终于解决了。现把各种解决方法归纳整理,希

分享到:

栏目导航

推荐阅读

热门阅读