【发布时间】:2012-12-21 02:15:04
【问题描述】:
我正在编写一个小型的 3 个服务器和 1 个客户端程序。 2台服务器发送tcp消息,最后一台使用winsock2发送upd数据报。
我想知道我是否可以通过使用线程(OpenMP 或 boost::threads)来模拟 recvfrom(),以便 2 个线程同时从同一个端口上的同一个套接字进行侦听。
我在 windows7 上使用 VC++ 2010。
感谢您的帮助。
【问题讨论】:
-
不,套接字不是线程安全的,每个线程都需要一个套接字,但是,使用 Windows 消息循环,您可以通知一个线程,反之亦然,线程本身可以有消息循环.
-
“TCP 消息”可以分片; TCP 是一种字节流协议。您将如何处理一个线程接收一半、另一个线程接收一半的消息?不可能的事实可以保护您免受更基本的设计错误的影响。在一个线程中接收和重组消息(这并不昂贵),然后将整个消息分派给其他线程进行进一步处理。
-
感谢您的回复。我会考虑每个线程使用一个套接字。
-
请注意,对于 TCP,为同一个套接字同时调用 recv 通常是没有意义的,但对于 UDP 则完全没问题。
-
@ezzakrem - 同一线程上的两个阻塞调用是一种罕见的情况(想想当线程已经卡在 recv 上时,通常如何从线程发出 recv),MS 文档说明了结果将是未定义的行为,而不是在其他情况下返回 WSAEINPROGRESS 的明确定义的行为。我真的很想知道它是如何为您工作的。
标签: c++ multithreading winsock2