sockets - Unix套接字: how to send really big data with one “send” call?

标签 sockets unix send

我正在使用unix scoket进行数据传输(SOCK_STREAM模式)

我需要发送超过100k个字符的字符串。首先,我发送一个字符串的长度-它是sizeof(int)个字节。

length = strlen(s)
send(sd, length, sizeof(int))

然后我发送整个字符串
bytesSend = send(sd, s, length)

但令我惊讶的是,“bytesSend”小于“length”。

请注意,当我发送的字符串不太大时,这可以正常工作。
可能我缺少的系统调用“发送”存在一些限制...

最佳答案

send系统调用应该是快速的,因为该程序可能还有其他有用的事情要做。当然,您不想等待数据发送出去,而又不想等待另一台计算机发送答复-这会导致吞吐量异常。

因此,send真正要做的就是将一些数据排队发送并返回给程序。内核可以将整个消息复制到内核内存中,但这会消耗很多内核内存(不好)。

取而代之的是,内核仅将合理数量的消息排队。重新尝试发送剩余数据是程序的责任。

在您的情况下,请使用循环发送第一次未发送的数据。

while(length > 0) {
    bytesSent = send(sd, s, length);
    if (bytesSent == 0)
        break; //socket probably closed
    else if (bytesSent < 0)
        break; //handle errors appropriately
    s += bytesSent;
    length -= bytesSent;
}

在接收端,您可能需要做同样的事情。

关于sockets - Unix套接字: how to send really big data with one “send” call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577825/

相关文章:

mysql - 向 WEB 服务器发送数据 : Data is being sent, 但仅发送一次

javascript - JavaScript 函数 commit() 和 send() 之间有什么区别?

c - recv() 套接字函数返回长度为 0 的数据

java - 当计时器结束时,如何中断用于从套接字接收数据的 while 循环?

json - jq 日期和 unix 时间戳

bash 脚本 - 如何将逗号分隔列表作为函数的输入参数进行处理

c - http 服务器响应(套接字)的 header 和内容之间存在差异

Java套接字读取错误异常与返回码

c - 从终端读取的后台作业

c - send()和recv()给我带来问题