【问题标题】:send() on a UDS socket returns without sending the entire data. Why?UDS 套接字上的 send() 返回而不发送整个数据。为什么?
【发布时间】:2019-03-05 18:50:30
【问题描述】:

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

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

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

我没有客户端代码,只有服务器代码,但我不允许在这里发布。据我所知,我没有看到服务器代码关闭了所述套接字。它仅在整个应用程序关闭时关闭。

有没有一种方法可以在没有客户端或服务器明确关闭它的情况下结束套接字连接?由于我没有客户端代码,我正在寻找服务器代码正在做一些愚蠢的事情的可能性。

感谢您对此的任何意见。

谢谢!

【问题讨论】:

    标签: c sockets unix-socket


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。但是您能否详细说明“取决于内部缓冲区大小”?缓冲区大小是否由“系统”定义,我们可以查看或更改缓冲区大小吗?
    • @AashishSharma “send() 和 write(2) 之间的唯一区别是标志的存在。使用零标志参数,send() 等效于 write(2)。”来源:man 2 send ......“写入的字节数可能少于 count,例如,如果底层物理介质上的空间不足,或者遇到 RLIMIT_FSIZE 资源限制(参见 setrlimit(2) ),或者在写入少于 count 个字节后调用被信号处理程序中断。(另见 pipe(7)。)" 来源:man 2 write
    • 感谢详细的解释!欣赏它。
    猜你喜欢
    • 2013-09-22
    • 2019-04-26
    • 2020-11-21
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多