非阻塞情况下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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • data:image/png;base64[通俗易懂]

    data:image/png;base64[通俗易懂]<imgsrc=”data:image/gif;base64,R0lGODlhJQAlAJECAL3L2AYrTv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgACACwAAAAAJQAlAAACi5SPqcvtDyGYIFpF690i8xUw3qJBwUlSadmcLqYmGQu6KDIeM13beGzYWWy3DlB4IYaMk+Dso2RWkFCfLPcRvFbZxFLUDTt21BW56TyjRep1e20+i+eYMR145W2eefj+6VFmgTQ

    2022年10月12日
  • html+css面试题集锦(一)

    html+css面试题集锦(一)1、对WEB标准以及W3C的理解与认识?web标准简单来说可以分为结构、表现和行为,其中结构主要是有HTML标签组成,或者通俗点来讲,在页面Body中我们写入的标签都是为了页面的结构,表现指css样式表,通过css可使页面的结构标签更具美感,行为是指页面和用户具有一定的交互,同时页面结构或者行为发生变化,主要是js组成。web标准一般是将该三部分独立分开,使其更具有模块化,但一般行为发生变…

  • ubuntu安装pycharm激活成功教程_pycharm安装后无解释器

    ubuntu安装pycharm激活成功教程_pycharm安装后无解释器首先需要安装JDK,Ubuntu自带openjdk的残留,可通过java-version命令进行查看,如果不安装JDK的话,pycharm安装时就会报错:NoJDKfound.PleasevalidateeitherIDEA_JDK,JDK_HOMEorJAVA_HOMEenvironmentvariable…,对于JDK的安装,网上有相当多的教程,但是大部分都不能利用…

  • httprunner(10)日志信息「建议收藏」

    httprunner(10)日志信息「建议收藏」日志信息每个用例都会生成一个对应的log日志,位置:<ProjectRootDir>/logs/TestCaseID.run.log.如果你想看到request和response、提取

  • idea2023 永久激活码【在线注册码/序列号/破解码】

    idea2023 永久激活码【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • Java内存管理-探索Java中字符串String(十二)

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!文章目录一、初识String类二、字符串的不可变性三、字符串常量池和 intern 方法四、面试题1、 String s1 = new String(“hello”);这句话创建了几个字符串对象?2、有时候在面试的时候会遇到这样的问题:**都说String是不可变的,为什么我可以这样做呢,String a = “1”…

发表回复

您的电子邮箱地址不会被公开。

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