c++ - 发送到失败的 C++//POSIX.4

标签 c++ sockets posix

所以 - 我正在运行一个应用程序,其中两个进程通过 UNIX 域套接字进行通信。通过套接字传递的绝大多数消息都得到了正确处理,但是当消息中的字节数超过一定限制时,我开始收到错误消息:

sendto failed: Message too long (POSIX.f)

我明白它在告诉我什么。我无法更改消息长度,也不想花时间对消息进行分段 - 而且所有消息都在同一台计算机上,因此我不必限制此域套接字上的消息长度。

有没有一种方法可以增加可写入域套接字的内存量,或者我在套接字初始化/sendto/recvfrom 调用中可能做错了什么会施加限制?我使用的发送/接收缓冲区非常大(比导致错误的消息大得多)。

最佳答案

您使用的是流套接字还是数据报套接字?如果它们是流式套接字,您只需执行第二次或第三次写入即可发送其余数据。如果它们是数据报套接字,您可能会卡住(也许您可以切换到流套接字?)但是可能有一个 setsockopt 选项会增加限制。您仍然可能需要为无法增加限制的情况做好准备。本质上你的问题是内核需要负责无限期地保留一个潜在的大数据单元,这很容易导致资源耗尽和 DoS,所以内核(有充分的理由)限制了它将为您保存的数据量。

关于c++ - 发送到失败的 C++//POSIX.4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876325/

相关文章:

python - 如何在不关闭 tcp 套接字的情况下发送文件结尾

C++:父对象在没有方法调用的情况下更改其id属性

c++ - 调整场景节点大小

c# - Begin-EndReceive 看不到到达的数据

c - 是否可以同时使用自定义 sigaction 信号处理程序和 pthread_sigmask?

macos - 在运行时在Mac OS X上设置进程名称

c++ - 在Linux中查询RTC和NTP时间?

c++ - 大数据集内存优化

c++ - 如何在循环中使用 OpenCV 记住以前的图像?

通过套接字进行 Java 加密对象序列化