C++ 多线程cpp CRT时如何同步recv()

C++ 多线程cpp CRT时如何同步recv(),c++,multithreading,synchronization,recv,C++,Multithreading,Synchronization,Recv,我有一个与多个客户端交互的服务器,其中客户端向服务器发送消息,服务器通过recv()方法读取消息。我遇到的问题是,我使用waitforsingleobject(处理程序,10000毫秒)让服务器等待几秒钟与一个客户机交互,然后让其他人访问它,但随后我开始看到来自服务器的答案,并向客户机发送了错误的消息,并被阻止。所以看起来像是一个同步问题 所以我的问题是(因为我是c++的乞丐),我如何确保每个传入的消息都被接收并回复到正确的客户端,允许所有客户端与服务器交互。有两种选择 首先是一个非常标准的模型

我有一个与多个客户端交互的服务器,其中客户端向服务器发送消息,服务器通过recv()方法读取消息。我遇到的问题是,我使用waitforsingleobject(处理程序,10000毫秒)让服务器等待几秒钟与一个客户机交互,然后让其他人访问它,但随后我开始看到来自服务器的答案,并向客户机发送了错误的消息,并被阻止。所以看起来像是一个同步问题


所以我的问题是(因为我是c++的乞丐),我如何确保每个传入的消息都被接收并回复到正确的客户端,允许所有客户端与服务器交互。

有两种选择

首先是一个非常标准的模型——每个客户端一个线程。当客户端连接时,您启动一个线程来处理它

第二种方法不需要很多线程。您应该在重叠套接字上使用WSARecv()而不是recv()。这样,您可以同时打开多个接收操作,每个客户端一个,然后在WaitForMultipleObjects()中等待它们。具体来说,您将在WSAOoverlapped内等待事件。请记住,WaitForMultipleObjects()对等待对象的数量有限制。当超过该值时,您将需要运行另一个线程。WaitForMultipleObjects()的返回代码将告诉您哪个客户端发送了数据,因此您可以回复它


或者,如上所述,您可能可以使用select()来确定哪个套接字包含数据。

使用boost asio-async accept旧的方式是使用select()API。