我开发的所有网络应用程序都使用阻塞套接字模型。我即将开始一个新项目,它要求用户能够向连接的服务器发送请求并在同一个套接字上并行接收响应,而不会发生数据争用。
我可以补充一下,这也是一个多线程应用程序(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 线程从套接字接收到完整的消息时,它需要将接收到的消息传递给适当的工作线程;这也需要通过某种线程安全机制来完成,但其实现将取决于接收线程的实现方式。