首页
社区
课程
招聘
未解决 [悬赏]Winsock 如何检测TCP的Reset状态? 5.00雪花
发表于: 2017-12-11 14:25 1894

未解决 [悬赏]Winsock 如何检测TCP的Reset状态? 5.00雪花

2017-12-11 14:25
1894
当使用TCP连接到一个“不存在”的端口的时候,有些服务器是可以让你"连接成功"的,但之后会发送一个Reset报文;

例如,使用Winsock的connect试图连接某服务器的8155端口(实际并没有应用程序在这个端口上提供服务),过程如下:

Client -> Server:SYN
Server->Client:ACK   SYN
Client->Server:ACK
Server->Client:ACK   Reset

其实服务器那边是因为根本没有应用程序在这个端口上提供服务,服务器才会发回一个Reset报文。 那么,这个TCP已经是“事实上断开”了。

但是,Winsock 的 connect 函数竟然可耻地返回了成功,成功! 然后send 也是成功,成功!recv 竟然也不会有错误发生!只是Timeout。

然后,我翻遍了MSDN和百度,都不知道该如何处理这种情况; 现在发现Winsock似乎对这种情况是完全无视,你要send,它只管send(并且告诉你send成功了), send了几次之后,发现服务器那边无回应(ACK),Winsock 才觉醒过来,然后主动向服务器发送一个 ACK Reset, 这下,你再recv,就是返回WSAECONNRESET错误!告诉你:  An existing connection was forcibly closed by the remote host.  很搞笑好嘛? 因为服务器老早就告诉你reset了,你却视而不见,非要自己发数据,发一次发现无ACK,又重发,再重发。。。然后,咦,服务器一直无ACK,这下才说连接被服务器强制关闭了。



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//