无阻塞情况connect生产EINPROGRESS错
今天的游戏开发client测试程序,非常多,因为出现client。后connect成功。代码证recv系统调用。后来发现,可能是由于socket默认模式被阻止,这将使很多client
接处于链接却不能数据传输状态。
后来改动socket为非堵塞模式,但在connect的时候,发现返回值为-1,刚開始以为是connect出现错误,但在server上看到了链接是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;
}
无阻塞情况connect生产EINPROGRESS错的更多相关文章
- 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密
		下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ... 
- 通过分析iframe和无阻塞脚本关系能让我们更懂iframe
		在我上篇文章里,我提到一种使用iframe完成无阻塞脚本加载的方式,因为我对iframe的偏见很大,所以上篇文章里我没有展开讨论这个问题. 文章发表后有位网友问了我这样一个问题,下面是他问题的原文,如 ... 
- 非阻塞方式connect编程
		参考博客: ①setsockopt()函数使用详解:http://blog.csdn.net/tody_guo/article/details/5972588 ②setsockopt :SO_LING ... 
- BlockingQueue 阻塞队列(生产/消费者队列)
		1:BlockingQueue的继承关系 java.util.concurrent 包里的 BlockingQueue是一个接口, 继承Queue接口,Queue接口继承 Collection Blo ... 
- 无阻塞加载js,防止因js加载不了影响页面显示
		浏览器加载静态资源和js的方式都是线性加载,所以一般情况可以将js放到</body>前,防止UI线程的阻塞. 而某些时候我们既希望js在整个网页的头部就加载,又担心js阻塞导致网站加载缓慢 ... 
- JS脚本文件的位置对页面加载性能影响以及无阻塞脚本(javascript)模式
		JS的阻塞特性:当<script>出现的时候,页面必须等待脚本文件的加载.解析.执行完毕后才能继续进行页面的渲染.不管脚本文件是以内联形式还是外部引入的形式出现在<script> ... 
- Web Worker无阻塞UI的牛逼技术,html5,可惜无法敢于UI
		众所周知,JavaScript是单线程的,JS和UI更新共享同一个进程的部分原因是它们之间互访频繁,但由于共享同一个进程也就会造成js代码在运行的时候用户点击界面元素而没有任何响应这样的情况,这么糟糕 ... 
- 使用Interlocked在多线程下进行原子操作,无锁无阻塞的实现线程运行状态判断
		巧妙地使用Interlocked的各个方法,再无锁无阻塞的情况下判断出所有线程的运行完成状态. 昨晚耐着性子看完了clr via c#的第29章<<基元线程同步构造>>,尽管这 ... 
- js同步、异步、延时、无阻塞加载
		一.同步加载 平常默认用的都是同步加载.如:<script src="http://yourdomain.com/script.js"></script> ... 
随机推荐
- C语言内存对齐
			转:http://blog.csdn.net/embeddedman/article/details/7429976 首先由一个程序引入话题: 1 //环境:vc6 + windows sp2 2 ... 
- Android-2手机应用程序,短信应用
			Activity生命周期 Android的核心组件 1.Viiew :界面 ,组织UI控件 2.Intent :意图,支持组件之间的通信 3.Activity:处理界面与UI互动 4.Conten ... 
- PHP SPL他们留下的宝石
			Rafael Dohms 上面的篇文章 让我为之惊艳,忍不住就翻译了下来,同一时候补充了部分内容. SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的 ... 
- Android支付接入(八):Amazon亚马逊支付
			下面跟大家一起走一遍Amazon亚马逊的支付,亚马逊目前刚把业务拓展到大陆市场,但这并不代表Amazon支付不成熟,恰恰相反,Amazon的支付流程,支付结果获取及测试另人称赞,支付流程.测试流程简洁 ... 
- Selenium执行测试脚本稳定性的一些经验分享交流
			Selenium执行测试脚本稳定性的一些经验分享交流 公司的自动化WEB测试框架IATA已上线运行了一段时间,期间发现一些脚本稳定性的问题,与大家分享一下. CASE执行游览器:ie firefox ... 
- C++实现链栈的基本操作
			之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ... 
- 浅析ArrayList,LinkedList的执行效率
			以前见过很多文章说这两个东西,感觉自己还是没有深入理解,今天看了书明白一些,在此提出来和大家共同探讨: 面试的时候(基础)一般会问你使用过LinkedList或者ArrayList没有,简单的回答有或 ... 
- Knockout应用开发指南 第三章:绑定语法(2)
			原文:Knockout应用开发指南 第三章:绑定语法(2) 7 click 绑定 目的 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用 ... 
- 用XAML做网页!!—边栏与页脚
			原文:用XAML做网页!!-边栏与页脚 此次我们来设计边栏和页脚,首先从页脚开始,其代码很简单: <Border x:Name="Footer" BorderBrush=&q ... 
- SVN中正确的add操作和delete操作
			add操作: delete操作: 
