recv()上的分段错误

recv()上的分段错误,c,C,我正在Unix上用C编写客户机/服务器程序,使用send/recv。我偶尔会从一个recv呼叫中得到一个分段错误。这种行为不是完全可复制的;有时它会发生,有时程序运行到完成 你知道这意味着什么吗?如果分段错误在recv()调用本身,那么这意味着传递给recv()的缓冲区没有正确分配,或者不是你告诉recv()的大小,这通常意味着您接收的数据超出了缓冲区允许的范围 例如,如果您malloc20个字节和recv1000个字节,您将遇到此问题 不幸的是,如果没有看到代码,如果没有心理调试领域的一些非常

我正在Unix上用C编写客户机/服务器程序,使用send/recv。我偶尔会从一个recv呼叫中得到一个分段错误。这种行为不是完全可复制的;有时它会发生,有时程序运行到完成


你知道这意味着什么吗?

如果分段错误在
recv()
调用本身,那么这意味着传递给
recv()
的缓冲区没有正确分配,或者不是你告诉
recv()
的大小,这通常意味着您接收的数据超出了缓冲区允许的范围

例如,如果您
malloc
20个字节和
recv
1000个字节,您将遇到此问题

不幸的是,如果没有看到代码,如果没有心理调试领域的一些非常迅速的进展,我们将永远无法确定



*a顺便说一句,这是发布代码的一个微妙提示:-)

这也可能意味着另一侧的套接字在写入之前已关闭。
这是一个可能导致应用程序关闭的SIGPIPE。

这不完全正确,SIGPIPE与分段错误不同。此外,他还提到,
recv
call上存在问题。SIGPIPE不会导致分段错误;它只是出口。此外,当没有接收器时,SIGPIPE会出现在写入端,但这不适用于
recv()
-它可能适用于
send()
。太微妙了,我几乎错过了它。嗯……但为什么它不是100%可复制的呢?因为调用未定义的行为不会给出可复制的结果。只需听从caf的建议,修复代码中不正确的大小或内存损坏错误。@user43944:这意味着有时重叠碰巧进入了进程不拥有的页面,而其他时候它只是在你拥有的随机内存中跺脚。