我可以从不同的线程调用socketsend()吗

Can I call socket send() from different threads?

本文关键字:socketsend 调用 线程 我可以      更新时间:2023-10-16

如果我有一个名为ssocket,我可以在不同的线程中执行此操作吗:

线程1:

send(s, "Hello from Thread 1");

线程2:

send(s, "Hello from Thread 2");

是否保证这两个字符串会一个接一个地放在发送缓冲区中(我不在乎先放哪一个),或者它们有可能混合在一起?

注意:也许这个问题的标题应该是:"socketsend()线程安全吗"(但我真的不确定线程安全意味着什么)

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