[tcp] 异步connect是否成功?

标签: 软件开发 connect tcp | 发表时间:2010-05-14 03:15 | 作者:(author unknown) 旺旺
出处:http://donghao.org/
我原先的client端代码流程如下:  

创建一个socket
设为异步socket(fcntl)
将socket加入epoll
connect到远端(此时connect调用返回非0,但errno为EINPROGRESS,表示正在建立连接中)
epoll_wait之
捕获到EPOLLOUT事件,此时便认为connect已经成功,client端开始发消息

这个过程通常能够运转,但是线上环境复杂多变,如果发生这种情况:server进程调用listen开始侦听后,被gdb或信号挂住了,此时异步connect会怎样?很遗憾,client端的epoll_wait依然返回EPOLLOUT,甚至往此socket里发消息都返回成功,只有当发的消息多得占完了server端的tcp缓冲以后(窗口收缩到很小),send调用才开始失败。这时候用 losf -i 看网络连接也很有趣,client端的机器显示连接建立了,server端的却显示没有这个连接。
仔细想想,OS这样做是正确的,毕竟connect的语义只是“连接”,当server挂住时,连接还是能成功的,但你能不能往里面发消息那就是另外一回事了。

所以对于应用来说,异步socket想要知道connect后连接是不是可以正常收发数据了,还是要靠应用层的一问一答才能知道。


====== 2010.5.14 ======

昨天同事朱照远给了一个更正确的解决方案,可参考之:
收到EPOLLOUT也不能认为是TCP层次上connect(2)已经成功,要调用getsockopt看SOL_SOCKET的SO_ERROR是否为0。若为0,才表明真正的TCP层次上connect成功。至于应用层次的server是否收/发数据,那是另一回事了。”

相关 [tcp 异步 connect] 推荐:

[tcp] 异步connect是否成功?

- 旺旺 - 斯巴达第二季
我原先的client端代码流程如下:  . 设为异步socket(fcntl). connect到远端(此时connect调用返回非0,但errno为EINPROGRESS,表示正在建立连接中). 捕获到EPOLLOUT事件,此时便认为connect已经成功,client端开始发消息. 这个过程通常能够运转,但是线上环境复杂多变,如果发生这种情况:server进程调用listen开始侦听后,被gdb或信号挂住了,此时异步connect会怎样.

Kafka Connect简介

- - 鸟窝
Kafka 0.9+增加了一个新的特性 Kafka Connect,可以更方便的创建和管理数据流管道. 它为Kafka和其它系统创建规模可扩展的、可信赖的流数据提供了一个简单的模型,通过 connectors可以将大数据从其它系统导入到Kafka中,也可以从Kafka中导出到其它系统. Kafka Connect可以将完整的数据库注入到Kafka的Topic中,或者将服务器的系统监控指标注入到Kafka,然后像正常的Kafka流处理机制一样进行数据流处理.

从Google Cloud Connect说开去

- 蓝皮 - It Talks--上海魏武挥的博客
Google很早就发布了它的Office套件产品,这款称为Google Doc的产品被视为进攻微软的武器之一. 不过,按照微软最新一季度的财报数字披露来看,Doc对微软的威胁很小:Office 2010比office 2007多卖出了50%的数量. 要知道,微软的Office产品是收费的,而google的则是免费的.

腾讯克隆Facebook Connect推出QQ Login

- openboy - 36氪
近日,科技博客Thenextweb撰文指出腾讯对Facebook Connect进行克隆推出了自己的QQ Login(QQ 登陆). 据悉该服务和Facebook Connect一样,允许用户通过其QQ账号就登入许多其他的第三方网站,从而避免用户需要再次注册账户的繁琐过程,而用户在第3方网站上分享的评论等也可以显示在腾讯自己的社交网络Qzone上.

tcp/ip调优

- Lucseeker - 在路上
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;.

浅谈TCP优化

- - 火丁笔记
很多人常常对 TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱. Ilya Grigorik 在「 High Performance Browser Networking」中做了很多细致的描述,让人读起来醍醐灌顶,我大概总结了一下,以期更加通俗易懂. 传输数据的时候,如果发送方传输的数据量超过了接收方的处理能力,那么接收方会出现丢包.

TCP报文结构

- - 互联网 - ITeye博客
一、TCP报文结构如下:.  固定首部长度为20字节,可变部分0~40字节,各字段解释:. source port number:源端口,16bits,范围0~65525. target port number:目的端口,16bits,范围同上. sequence number:数据序号,32bits,TCP 连接中传送的数据流中的每一个字节都编上一个序号.

TCP 状态变化

- - 互联网 - ITeye博客
关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况. 前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接. 将关闭部分的状态转移摘出来,就得到了下图:. 通过图上,我们来分析,什么情况下,连接处于CLOSE_WAIT状态呢.

Windows Live 发布托管于 GitHub 的 Messenger Connect 代码范例库

- Bloger - LiveSino - LiveSide 中文版
微软最近推出了新版 Messenger Connect 开发平台 – 允许开发者在应用中整合 Windows Live ID、Hotmail、Messenger 和 SkyDrive. 昨晚 Windows Live 团队的 Dare Obasanjo 又宣布了一系列托管于 GitHub的代码范例库,主要包括三部分:.

Mindjet Connect – 在线思维导图兼任务管理工具

- - 小众软件 - Appinn
Mindjet Connect 是老牌的思维导图软件商 Mindjet 推出的在线应用,除了在线编辑思维导图外,还支持手机端同步,并且有一整套完整的任务管理功能,适合同事之间传递分发任务. 感谢 guojimail 的推荐. Mindjet Connect 为免费账号提供 2GB 的空间,并且可以连接同步 Google Calendar, Google Docs, and Google Tasks.