如果我有一个名为socket
的{{1}},我可以在不同的主题中执行此操作:
主题1:
s
主题2:
send(s, "Hello from Thread 1");
是否可以保证这两个字符串会一个接一个地放在发送缓冲区中(我不关心哪一个首先放置),或者它们是否有可能混合在一起?
注意: 也许这个问题的标题应该是:“socket send()线程是否安全”(但我不确定线程安全意味着什么) )。
答案 0 :(得分:1)
答案是否定的。通常send()
不保证数据是一次性发送的。您始终需要检查send()
返回的值,以便找出实际发送的字节数。如果这小于缓冲区的大小(不错误),则必须再次调用send()
,例如在循环中,例如像这样的东西:
char *msg="Hello from thread 1";
size_t pos;
size_t currentBytes;
size_t BytesToSend=strlen(msg);
for (pos=0 ; pos < BytesToSend ; pos += currentBytes) {
currentBytes = send(s, msg + pos, BytesToSend - pos, 0);
if (currentBytes <= 0) {
// error occurred (-1) or connection has been closed on remote site (0)
return ...
}
}
这意味着您的数据可能会分成几部分,而当从两个线程发送时,数据可能会混合在一起。
另请参阅send()参考,尤其是
如果没有错误发生,send返回发送的总字节数,可以小于len参数中请求发送的数字。