如何从客户端在recv()中导致ECONNRESET?

amo*_*moe 1 c sockets linux posix

我正在使用一个服务器,在调用recv()后返回-1并将errno设置为ECONNRESET时崩溃.我最初使用nmap找到了这个条件(我不是一个破解者,只是测试当时端口是否打开.)但是,nmap使用原始套接字所以我不太乐意将此作为测试用例提交给开发人员.我宁愿在C中编写一个可以导致ECONNRESET的客户端程序.

从我的客户端立即连接后连接()到服务器,然后关机()套接字:到目前为止,我已经试过两件事情.服务器上的recv()仍然返回1(我已经插入了调试代码,所以我可以看到返回值.)我也尝试用一些字符串调用send(),然后立即调用shutdown().没有骰子,弦被传送好了.

那我怎么会造成这种情况呢?非便携式很好,我正在使用Linux.

Die*_*Epp 5

问题是你在打电话shutdown.打电话close来.

看一下TCP状态图.

http://tangentsoft.net/wskfaq/articles/debugging-tcp.html

基本上,shutdown通过发送FIN并等待对等体完成(FIN - > ACK/FIN - > ACK - >关闭)来"礼貌地"关闭套接字,此时你调用close并且一切都很好.如果你先打电话close不打电话shutdown,那就是发送RST的"不礼貌"版本 - 相当于在电话中间挂断,而不是等待对方完成他们所说的话.

将"关闭"视为"说再见",将"关闭"视为"挂断".你总是要挂断电话,但你不必先说再见.

关于nmap:为开发人员提供一个使用nmap的测试用例是完全可以接受的.无论如何,这是nmap的主要目的之一.

  • 谢谢!使用close()而不是shutdown()效果很好.令我困惑的一件事是我必须尝试几次使用close()来获取ECONNRESET,其中nmap可以立即触发它.但我想nmap可以直接发送TCP RST,而使用高级套接字API则必须依靠OS时序来切断连接. (2认同)