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

时间:2015-02-25 14:08:01

标签: c++ windows multithreading sockets network-programming

如果我有一个名为socket的{​​{1}},我可以在不同的主题中执行此操作:

主题1:

s

主题2:

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

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

注意: 也许这个问题的标题应该是:“socket send()线程是否安全”(但我不确定线程​​安全意味着什么) )。

1 个答案:

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