非法内存写入导致recv()返回零

时间:2016-07-13 16:51:40

标签: c linux sockets tcp

我以某种方式从套接字断开连接,或者至少从recv()返回的值为零。从似乎触发问题的方面来看,我认为这是一个超出范围的内存写入。但是,我正在输出我的套接字的值,并且没有被破坏。

有没有办法可以检测到"断开"没有调用recv()(因为我已经调用它来读取字节,我正在寻找可以在整个代码中查询的东西,以确切地检测"断开"何时发生)?

由于非法内存写入而recv()是否可能返回零,但套接字描述符值是否保持不变?

2 个答案:

答案 0 :(得分:2)

来自recv的返回值0表示EOF,即对等体已关闭其连接的结束(或至少将其关闭以通过shutdown写入)。我没有理由相信它应该与你身边的记忆破坏有关; recv通常是一个非常简单的系统调用包装器,即使你的程序调用了未定义的行为,你在用户空间中做的任何事情都不太可能影响它的行为。

答案 1 :(得分:0)

不,您可以通过读/写来查找插件严格上发生了什么。找不到其他(可靠的)方法。

  

由于非法内存,recv()是否可能返回零   写,但套接字描述符值保持不变?

如果出现问题,recv会返回-1并相应地设置errno(在这种情况下为EFAULT),而不是0

您可以使用AddressSanitizer或valgrind和Wireshark等工具分析您的身份。