同时执行 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的主要内容,如果未能解决你的问题,请参考以下文章

socket编程·send和recv

是否有可能以某种方式同时在 ZMQ 中使用 Send/Recv(通过多线程)?

使用 MPI_Send 和 MPI_Recv 未正确接收矩阵

如何查看端口recv和send

使用 libcurl 执行 HTTP POST - 摘要式身份验证,使用 curl_easy_send\ curl_easy_recv

ss命令和Recv-Q和Send-Q状态