Tom*_*Tom 5 c++ sockets windows multithreading network-programming
如果我有一个socket被调用的s,我可以在不同的线程中执行此操作:
主题 1:
send(s, "Hello from Thread 1");
Run Code Online (Sandbox Code Playgroud)
话题2:
send(s, "Hello from Thread 2");
Run Code Online (Sandbox Code Playgroud)
是否保证这两个字符串将一个接一个地放置在发送缓冲区中(我不关心哪个字符串先放置),或者它们是否有可能混合在一起?
注意:也许这个问题的标题应该是:“socket send() 线程安全吗”(但我不太确定线程安全意味着什么)。
答案是不。通常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 ...
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着您的数据可能会分段到达,并且当从两个线程发送时,数据可能会混合在一起。
另请参阅send()参考,特别是
如果没有发生错误,send 返回发送的总字节数,该字节数可以小于 len 参数中请求发送的字节数。