非阻塞情况下connect产生EINPROGRESS错误[通俗易懂]

非阻塞情况下connect产生EINPROGRESS错误[通俗易懂]//原文地址:http://blog.csdn.net/saspss/article/details/8487678、、、、今天,在调试socket,非阻塞模式下,发现连接服务器时connect老是回复-1,很是苦恼。后来,看到某一个前辈的代码,思路和下面这篇文章差不多意思。就是,非阻塞模式下的连接服务器,要判断下返回值,是否是EINPROGRESS,如果是,说明这个soc

大家好,又见面了,我是你们的朋友全栈君。

//原文地址:http://blog.csdn.net/saspss/article/details/8487678

、、、、

今天,在调试socket,非阻塞模式下,发现连接服务器时connect老是回复-1,很是苦恼。后来,看到某一个前辈的代码,思路和下面这篇文章差不多意思。

就是,非阻塞模式下的连接服务器,要判断下返回值,是否是EINPROGRESS,如果是,说明这个socket应该是好的。

将文章转载过来,供遇到问题的童鞋参考。

、、、、

今天在开发游戏客户端测试程序时,由于出现很多客户端,经过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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160510.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月17日 下午9:46
下一篇 2022年7月17日 下午10:00


相关推荐

  • n8n注册时邮箱验证失败怎么办?

    n8n注册时邮箱验证失败怎么办?

    2026年3月15日
    2
  • 电脑端上有哪些免费好用的思维导图软件?

    电脑端上有哪些免费好用的思维导图软件?看到这篇文章的你 是不是也在找适合 Windows 系统使用的思维导图软件呢 这里小编给大家整理了几款良心又好用的思维导图软件 亿图脑图亿图脑图自带有精美的设计元素以及其预设的主题样式 为用户提供了更能节约时间的操作 成为现代办公和学习中的一款效率工具 其软件授权有免费版 专业版和订阅版 用户可根据自身需求进行选择 不要以为免费就不好 其免费版本可是有大量的忠实用户的支持的 XMindXmind 的特点是 国产而更有国际化发展 商业化并兼有开源版本 因此在使用的过程中不仅符

    2026年3月16日
    2
  • android之实现打开相册、拍照录像、播放视频、保存图片到系统相册\指定位置、图片压缩[通俗易懂]

    android之实现打开相册、拍照录像、播放视频、保存图片到系统相册\指定位置、图片压缩[通俗易懂]———照相录像——//实现照相、录像的功能publicvoidcameraForphoto(){Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);Filefile=newFile(Environment.getExternalStorageDirecto…

    2025年12月9日
    4
  • C++ 求矩阵的秩

    C++ 求矩阵的秩网易笔试题:混合颜料下面 int getNumOfLeastColors(setint>& colorSet) {// 求二进制矩阵的秩,即消元,最后看斜对角线上有几个 1  的方法,就是求矩阵的秩你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的

    2022年5月7日
    59
  • 怎么用postman测试websocket

    怎么用postman测试websocketwebsocket学习定义优点用法参考文献菜鸟教程怎么用postman测试websocket因为升级请求是被postman拦截的,所以,只要配置一下拦截器就好了,具体配置方法百度一下吧。然后在header中加上两个key-value即可。Upgrade:websocketConnection:Upgrade2.基础用法3.当然,这些都不如在线测试webs……

    2022年7月11日
    31
  • 文心一言AI写作怎么操作?新手必看的保姆级教程!

    文心一言AI写作怎么操作?新手必看的保姆级教程!

    2026年3月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号