我以某种方式从套接字断开连接,或者至少从recv()
返回的值为零。从似乎触发问题的方面来看,我认为这是一个超出范围的内存写入。但是,我正在输出我的套接字的值,并且没有被破坏。
有没有办法可以检测到"断开"没有调用recv()(因为我已经调用它来读取字节,我正在寻找可以在整个代码中查询的东西,以确切地检测"断开"何时发生)?
由于非法内存写入而recv()
是否可能返回零,但套接字描述符值是否保持不变?
答案 0 :(得分:2)
来自recv
的返回值0表示EOF,即对等体已关闭其连接的结束(或至少将其关闭以通过shutdown
写入)。我没有理由相信它应该与你身边的记忆破坏有关; recv
通常是一个非常简单的系统调用包装器,即使你的程序调用了未定义的行为,你在用户空间中做的任何事情都不太可能影响它的行为。
答案 1 :(得分:0)
不,您可以通过读/写来查找插件严格上发生了什么。找不到其他(可靠的)方法。
由于非法内存,recv()是否可能返回零 写,但套接字描述符值保持不变?
如果出现问题,recv
会返回-1
并相应地设置errno
(在这种情况下为EFAULT
),而不是0
。
您可以使用AddressSanitizer或valgrind和Wireshark等工具分析您的身份。