-
-
未解决 [悬赏]Winsock 如何检测TCP的Reset状态? 5.00雪花
-
发表于: 2017-12-11 14:25 1917
-
当使用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,这下才说连接被服务器强制关闭了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: