UDS套接字上的send()返回而不发送全部数据。为什么?

时间:2019-03-05 18:50:30

标签: c sockets unix-socket

我正在运行Linux的嵌入式设备上工作。在我的应用程序中,服务器线程打开一个UDS套接字并等待连接。当客户端(其他应用程序/进程)连接时,它将处理请求并发送请求的数据。

请求的数据通常大于52KB。但是,send()调用仅在发送32064字节后返回。间歇地看到此行为;通常,整个52KB或更多都可以毫无问题地发送到客户端进程。

请问有人建议send()在传输过程中返回的可能原因是什么?

我没有客户端代码,只有服务器代码,但是我不允许在这里发布。从我所拥有的,我看不到服务器代码曾经关闭所述套接字。仅在整个应用程序关闭时才关闭。

在没有客户端或服务器显式关闭套接字的情况下,套接字连接是否可以终止?由于我没有客户端集群,因此我正在寻找服务器代码做一些愚蠢的事情的可能性。

感谢对此的任何投入。

谢谢!

1 个答案:

答案 0 :(得分:2)

成功后,send()返回发送的字节数,这不能保证您的所有数据都已写入,您需要使用剩余数据再次调用它,此行为取决于内部缓冲区的大小。 read()函数具有相同的行为。

“ send()和write(2)之间的唯一区别是标志的存在。参数为零时,send()等效于write(2)。” 来源:man 2发送

”例如,如果基础物理介质上的空间不足,或者遇到RLIMIT_FSIZE资源限制(请参阅setrlimit(2)),或者调用,则写入的字节数可能少于计数写入少于计数字节后被信号处理程序中断。(另请参见pipe(7)。)” 来源:man 2 write