Winsock 如何检测TCP的Reset状态?

jmpjmpje 2017-12-11 02:22:40
当使用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,这下才说连接被服务器强制关闭了。

...全文
377 6 点赞 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
danscort2000 2017-12-14
引用 3 楼 zhao4zhong1 的回复:
[quote=引用 2 楼 danscort2000 的回复:] 光google或者百度搜索是没什么意义的,这涉及到了底层的实现 tcp/ip 协议栈 你明显没读过tcp/ip 协议卷1-3
百度搜索搜不到 《TCP-IP详解卷一:协议》 《TCP-IP详解卷二:实现》 《TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议》 里面的内容? [/quote] 我怀疑你的理解能力,我说的是要详细理解或者解释为什么这样,需要阅读并理解tcp/ip底层的实现, 光搜索到内容有毛用?有几个人肯花苦功夫去看这种大块头?
  • 打赏
  • 举报
回复
自己做一个心跳包,用于检测。
  • 打赏
  • 举报
回复
zgl7903 2017-12-13
这个应该不是WinSock的问题, WSAEventSelect 启动 FD_CLOSE 事件, 等待关闭事件, 或者线程中 不断 recv ,处理<=0的情况
  • 打赏
  • 举报
回复
赵4老师 2017-12-12
引用 2 楼 danscort2000 的回复:
光google或者百度搜索是没什么意义的,这涉及到了底层的实现 tcp/ip 协议栈 你明显没读过tcp/ip 协议卷1-3
百度搜索搜不到 《TCP-IP详解卷一:协议》 《TCP-IP详解卷二:实现》 《TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议》 里面的内容?
  • 打赏
  • 举报
回复
danscort2000 2017-12-11
光google或者百度搜索是没什么意义的,这涉及到了底层的实现 tcp/ip 协议栈 你明显没读过tcp/ip 协议卷1-3
  • 打赏
  • 举报
回复
oyljerry 2017-12-11
那你不用winsock,直接用sokcet API呢
  • 打赏
  • 举报
回复
相关推荐
发帖
网络编程
加入

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2017-12-11 02:22
社区公告
暂无公告