我可以从不同的线程调用套接字 send() 吗?

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() 线程安全吗”(但我不太确定线程安全意味着什么)。

sb9*_*sb9 2

答案是不。通常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 参数中请求发送的字节数。