【问题标题】:persistent tcp socket connection in cc中的持久tcp套接字连接
【发布时间】:2016-03-02 18:48:09
【问题描述】:

我有一个C 服务应用程序,它使用tcp socket 连接到服务器。服务器不时发送数据。此外,我的应用程序每 15 秒发送一次心跳。但有时它会在服务器似乎认为连接处于活动状态时断开连接。现在,如果我尝试重新连接服务器会拒绝,因为它一次只为客户端保留一个连接。

保持持久tcp connection 的最佳方式是什么?

编辑: 服务器通常会在 2 分钟后断开连接而没有心跳。因此,在我发现我的连接已关闭后,我需要 2 分钟才能成功重新连接。我想尽量减少这个时间。

【问题讨论】:

  • 您对持久性的期望是什么(例如电缆断开或接入点出现故障),我认为您的问题没有解决方案。
  • @dvhh 问题主要发生在发送心跳期间,有时会出现 sigpipe 或其他问题。服务器似乎认为连接没有关闭。
  • 服务器上没有看门狗在没有收到心跳的情况下关闭连接吗?
  • 显示一些代码,你的问题太笼统了...反正程序定义的心跳不是一个好主意,你最好使用UTO TCP参数。
  • 你总是可以同时解决这两个问题。将您的服务器变成真正的服务器(即可以处理多个独立的连接),并使用 TCP keepalive 来识别并关闭任何剩余的“半连接”。

标签: c sockets tcp


【解决方案1】:

最简单的解决方法可能是让服务器允许新连接替换旧连接,而不是拒绝它。这仍然会一次只与每个客户端保持一个连接。

【讨论】:

  • 虽然这是一个可行的解决方案,但这会增加 DOS 攻击的漏洞。
  • @nomem 你怎么看?
  • 如果一个连接总是替换旧的连接,那么如果多个客户端尝试使用相同的用户名密码进行连接,我的服务器将忙于这样做。现在如果一个连接没有被替换,那么其他请求将被忽略。
  • 好吧,您必须断开一个连接或另一个。我不明白为什么在 DOS 攻击方面你放弃它会产生重大影响。
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多