我正在使用unix scoket进行数据传输(SOCK_STREAM模式)
我需要发送超过100k字符的字符串。首先,我发送一个字符串的长度 - 它的sizeof(int)字节。
length = strlen(s)
send(sd, length, sizeof(int))
然后我发送整个字符串
bytesSend = send(sd, s, length)
但令我惊讶的是“bytesSend”小于“length”。
请注意,当我发送不那么大的字符串时,这样可以正常工作。 对于我一直缺少的系统调用“发送”可能存在一些限制......
答案 0 :(得分:11)
send
系统调用应该是 fast ,因为程序可能有其他有用的事情要做。当然,你不想等待数据被发送出去而另一台计算机发送回复 - 这将导致可怕的吞吐量。
因此,所有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;
}
在接收端你可能需要做同样的事情。
答案 1 :(得分:1)
您的初始send()
来电是错误的。您需要传递send()数据的地址,即:
bytesSend = send(sd, &length, sizeof(int))
此外,这会遇到一些经典风险,包括字节序,各种平台上int
的大小等等。