同时执行recv()和send()winsock

时间:2012-01-03 04:40:14

标签: c multithreading winsock

我想创建一个简单的聊天应用程序,没有可以连接和路由数据的公共服务器。但是,我不知道如何不轮流进行,这对于聊天程序来说很奇怪。

我认为我可以进行多线程处理,但到目前为止我发现的信息只是关于客户端请求的线程(绕过客户端队列的事情)。我以前绝对没有尝试过多线程。我也不知道这是否是唯一的方法。我也做过事情驱动的事情,但是我无法让ncurses在VS上工作(它成功链接和编译但是库本身出现了问题,似乎)。

所以基本上我如何制作聊天程序而轮流。毕竟,调用recv()只是保持不变,直到它收到一些东西,所以在那段时间我不能调用任何stdin函数。

2 个答案:

答案 0 :(得分:2)

使用事件循环。

1)发生了什么事吗?

2)如果是,请处理它。

3)如果没有,请等待某事发生或持续一段时间。

4)转到第1步。

现在,您只需将可能发生的所有事情(例如在套接字上接收的数据)设置为您可以在步骤3中等待的事件。对于套接字,您可以使用WSAEventSelect执行此操作。您可以使用WaitForMultipleEvents等待活动。

或者,只要在WSAAsyncSelect的套接字上收到数据,您就可以安排让Winsock向您的程序发送Windows消息。

答案 1 :(得分:0)

在致电recv之前,请检查数据是否可用。您可以使用select或poll来使用它。 请参阅选择参考,也许winsock FAQ