【发布时间】:2015-02-25 23:26:43
【问题描述】:
我读到你不应该在来自多个线程的阻塞套接字上使用send(),但我不知道为什么!如果我想在多个线程中使用send(),我可以做些什么来允许它?
我正在使用 Windows。
【问题讨论】:
-
同时发送?还是在不同的时间发送?
-
@thang 同时。
-
如果它是一个流套接字,你有一个问题是让流有意义......
-
@thang 你的意思是缓冲区可以混合在一起?
-
@Tom 如果您使用 UDP,您可以摆脱它,因为每次调用 send() 都会产生一个单独的 UDP 数据包。对于 TCP,它只有在每次调用 send() 都包含完整的消息时才有效;否则来自两个线程的消息交错将混淆远程客户端中的解析器。但问题是 send() 可以在没有发送您要求它发送的所有数据的情况下返回——这意味着您不能保证每次调用 send() 都会包含完整的消息!所以对于 TCP,指定一个线程来处理发送,并让另一个线程转发给发送者线程。