c++ - 如何在没有数据竞争的情况下在一个套接字上实现具有并行请求和响应的非阻塞客户端-服务器通信模型

标签 c++ winapi networking methodology

<分区>

我开发的所有网络应用程序都使用阻塞套接字模型。我即将开始一个新项目,它要求用户能够向连接的服务器发送请求并在同一个套接字上并行接收响应,而不会发生数据争用。

我可以补充一下,这也是一个多线程应用程序(x 个客户端到 1 个服务器),所以我希望能够同时向服务器发送请求,而不必等待上一个recv/send 但同时能够在同一个套接字上接收响应。我希望这是有道理的。

我最后的选择是对每个请求使用 connect/receive> request/serve> close 的 HTTP 模型。

PS:我不是在找代码

最佳答案

我的做法是让 I/O 线程成为唯一允许读取或写入套接字的线程。该线程保持传出请求消息的 FIFO 队列,并且只要套接字 select() 准备好写入,它就会将数据从(该队列的头部)写入套接字,并在任何时候从套接字读取套接字 select() 已准备好读取。

其他线程可以随时向 I/O 线程的传出请求队列的尾部添加消息(请注意,您需要通过互斥锁或其他方式将这些添加与 I/O 线程同步,并且如果在向其添加新请求之前传出请求队列为空,则需要一种机制来唤醒 I/O 线程,以便它可以开始发送新请求;将一个字节写入自连接套接字- 另一端的 I/O 线程 select() 将为此目的工作)

对于另一个方向:当 I/O 线程从套接字接收到完整的消息时,它需要将接收到的消息传递给适当的工作线程;这也需要通过某种线程安全机制来完成,但其实现将取决于接收线程的实现方式。

关于c++ - 如何在没有数据竞争的情况下在一个套接字上实现具有并行请求和响应的非阻塞客户端-服务器通信模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120756/

相关文章:

c++ - 需要左值作为赋值错误的左操作数

c++ - 将递归函数重写为非递归函数

c++ - 将 LPTSTR 转换为 string 或 char * 以写入文件

c++ - 链接到 DLL 的未处理异常

javascript - 在nodejs中访问网络驱动器?

java - 安卓有网络吗?

ubuntu - 在ubuntu中通过终端访问无线网络

c++ - C++ 中的列表函数

c++ - 通过 HTTP 加载外部 HTML 时 DHTML_EVENT_ONCLICK 不起作用?

c++ - WinAPI SetSystemCursor 和 LoadCursorFrom - 如何设置默认光标?