amo*_*moe 1 c sockets linux posix
我正在使用一个服务器,在调用recv()后返回-1并将errno设置为ECONNRESET时崩溃.我最初使用nmap找到了这个条件(我不是一个破解者,只是测试当时端口是否打开.)但是,nmap使用原始套接字所以我不太乐意将此作为测试用例提交给开发人员.我宁愿在C中编写一个可以导致ECONNRESET的客户端程序.
从我的客户端立即连接后连接()到服务器,然后关机()套接字:到目前为止,我已经试过两件事情.服务器上的recv()仍然返回1(我已经插入了调试代码,所以我可以看到返回值.)我也尝试用一些字符串调用send(),然后立即调用shutdown().没有骰子,弦被传送好了.
那我怎么会造成这种情况呢?非便携式很好,我正在使用Linux.
问题是你在打电话shutdown.打电话close来.
看一下TCP状态图.
http://tangentsoft.net/wskfaq/articles/debugging-tcp.html
基本上,shutdown通过发送FIN并等待对等体完成(FIN - > ACK/FIN - > ACK - >关闭)来"礼貌地"关闭套接字,此时你调用close并且一切都很好.如果你先打电话close不打电话shutdown,那就是发送RST的"不礼貌"版本 - 相当于在电话中间挂断,而不是等待对方完成他们所说的话.
将"关闭"视为"说再见",将"关闭"视为"挂断".你总是要挂断电话,但你不必先说再见.
关于nmap:为开发人员提供一个使用nmap的测试用例是完全可以接受的.无论如何,这是nmap的主要目的之一.