我可以从不同的线程调用socketsend()吗
Can I call socket send() from different threads?
如果我有一个名为s
的socket
,我可以在不同的线程中执行此操作吗:
线程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参数中请求发送的字节数。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 我可以从不同的线程调用socketsend()吗