2012-01-03 85 views
0

我想创建一个简单的聊天应用程序,但没有用于连接和路由其数据的通用服务器。但是,我不知道如何不轮流,这对聊天程序来说很奇怪。同时执行recv()和send()winsock

我想我可以做多线程,但我发现的信息到目前为止只是关注客户端请求的线程(绕过客户端队列的东西)。我绝对没有尝试过多线程之前。我也不知道这是否唯一的方法。我也尽管做了一些事件驱动,但是我不能让ncurses在VS上工作(它成功地链接和编译,但是库本身看起来有些问题)。

那么基本上我该如何让一个聊天程序和不是轮流。毕竟,调用recv()直到它收到一些东西,所以在那段时间我不能调用任何stdin函数。

回答

2

使用事件循环。

1)有没有发生?

2)如果是这样,处理它。

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

4)转到步骤1.

现在,你就必须让一切都可能发生(如套接字上接收数据)的事件,您可以在步骤3等待对于插座,你用WSAEventSelect来做到这一点。您可以等待WaitForMultipleEvents的活动。

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

0

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