【问题标题】:TCP push-pull socket server designTCP 推挽式套接字服务器设计
【发布时间】:2014-12-23 14:10:58
【问题描述】:

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

服务器将基于 TCP,用 C++ 编写。我难以理解的是如何管理设计的双向性质。我需要一个客户端能够像往常一样向服务器发送数据包,但也可以监听数据包。如何缓解以下情况,例如,客户端在服务器尝试向其发送数据时正在发送数据,或者它被阻止侦听数据但随后需要发送一些东西?

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

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

或者有更好的方法吗?

【问题讨论】:

  • tcp 连接是双向的。一旦你有一个连接 aserver 和 serverb,两个连接的任一端都可以向另一端发送一个数据包。更重要的决定是如何构建/格式化您的数据,以便您可以识别每个数据包的含义。
  • 不要使用术语“数据包”(网络层的东西)来指代应用层消息。只会造成混乱。
  • @MarcB 我知道你可以在 TCP 连接上发送和接收数据,但是你可以同时做吗?
  • 是的,您可以同时进行。

标签: c++ sockets tcp


【解决方案1】:

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

【讨论】:

  • @Alnitak 你的意思不是“或”,而是“和”。在阻塞套接字上使用 select 会导致各种问题。 (选择命中并不能保证未来的操作不会阻塞。怎么可能?)
  • @Alnitak 谢谢,已修复。如果你删除你的评论,我会删除这条。
  • 所以只要我不阻塞,例如在阻塞接收中,他们可以同时读/写数据,我想多了?
【解决方案2】:

我认为解决方案非常简单。 TCP 服务器应该有一个包含已连接客户端的列表。由于 TCP 连接是双向的,因此推送机制非常简单。

另一件重要的事情是,只要您的服务器不是多线程的,您就可以同时读取或写入一个客户端。

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 2012-06-13
    • 2014-07-02
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2015-09-29
    相关资源
    最近更新 更多