同时执行 recv() 和 send() winsock
Posted
技术标签:
【中文标题】同时执行 recv() 和 send() winsock【英文标题】:Do both recv() and send() winsock 【发布时间】:2012-01-03 04:40:14 【问题描述】:我想创建一个简单的聊天应用程序,没有用于连接和路由数据的公共服务器。但是不轮流不知道怎么做,这对于聊天程序来说很奇怪。
我想我可以做多线程,但到目前为止我发现的信息只是关于线程与客户端请求有关(绕过客户端队列的事情)。我以前绝对没有尝试过多线程。我也不知道这是否是唯一的方法。我也想做一些事件驱动的事情,但我无法让 ncurses 在 VS 上工作(它成功链接和编译,但库本身似乎有问题)。
所以基本上我如何制作一个聊天程序并且不轮流进行。毕竟,调用 recv() 会一直保持到它收到一些东西,所以在那段时间我不能调用任何标准输入函数。
【问题讨论】:
【参考方案1】:使用事件循环。
1) 发生什么事了吗?
2) 如果有,请处理。
3) 如果没有,请等待某事发生或等待一段时间。
4) 转到步骤 1。
现在,您只需将所有可能发生的事情(例如在套接字上接收到的数据)设置为您可以在第 3 步中等待的事件。对于套接字,您可以使用WSAEventSelect 来执行此操作。您可以使用WaitForMultipleEvents 等待事件。
或者,您可以安排让 Winsock 在使用WSAAsyncSelect 的套接字上接收到数据时向您的程序发送一条 Windows 消息。
【讨论】:
【参考方案2】:在调用 recv 之前,请检查数据是否可用。您可以使用 select 或 poll 来使用它。 请参阅选择参考,可能还有winsock FAQ。
【讨论】:
以上是关于同时执行 recv() 和 send() winsock的主要内容,如果未能解决你的问题,请参考以下文章
是否有可能以某种方式同时在 ZMQ 中使用 Send/Recv(通过多线程)?
使用 MPI_Send 和 MPI_Recv 未正确接收矩阵
使用 libcurl 执行 HTTP POST - 摘要式身份验证,使用 curl_easy_send\ curl_easy_recv