c++ - TCP推拉套接字服务器设计

标签 c++ sockets tcp

作为学习练习,我正在设计一个跨平台消息服务。我以前编写过基于套接字的服务器,但始终是“客户端-轮询-服务器”设计,如 Web 服务器。我希望能够针对移动平台,并且我了解到轮询会耗尽电池电量,所以我想推送通知。

服务器将基于 TCP,用 C++ 编写。我无法理解的是如何管理设计的双向特性。我需要一个客户端能够像往常一样向服务器发送数据包,而且还能监听数据包。我该如何缓解这样的情况,例如,当服务器试图向客户端发送数据时客户端正在发送数据,或者它被阻止监听数据但随后需要发送一些东西?

例如,考虑以下粗略的图表:

crude diagram

因此,假设客户端 A 正在发送一大块数据(箭头 1)。发生这种情况时,客户端 B 发送一条消息(箭头 2),这会导致服务器尝试将数据发送回客户端 A(箭头 3),但客户端 A 尚未完成发送箭头 1。在这种情况下会发生什么?我应该在每个客户端上设置 2 个单独的端口,一个用于入站,一个用于出站吗?我是否需要跟踪每个连接的状态?

或者是否有更好的方法来解决这个问题?

最佳答案

一个套接字端口本质上是双向的。要或多或少地同时处理入站和出站流量,您需要使用非阻塞套接字。

关于c++ - TCP推拉套接字服务器设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27622066/

相关文章:

c - 在 TCP/IP 聊天程序中无法工作

telnet - 处理 Telnet 协商

C++ make_shared 调用析构函数两次

c++ - 使用无效 IP 创建 IPv6 套接字失败 - 似乎被截断了

Ruby 如何将 32 位整数转换为网络字节序?

c - 如何纠正从客户端读取数据的套接字编程错误?

ios - Iphone 监听一个 tcp 端口

c++ - 知道函数内部参数中基指针派生类的类型吗?

c++ - 433 接收器 Arduino if 语句

面对大项目的C++书籍推荐