【问题标题】:Send TCP segment with modified header发送带有修改头的 TCP 段
【发布时间】:2013-12-31 15:36:45
【问题描述】:

我正在设计一个 TCP 服务器,我需要尽快删除 half-opened connections。每n 秒,我都会尝试向客户端发送一些数据,当我收到错误时,我会停止轮询它们。

它工作得很好,除了我的客户收到一些垃圾我每n 秒发送给他们并且必须解析它。

我想发送一个零字节数据的 TCP 段。是否可以修改 TCP 段头并发送某种没有数据的假 SYNACK 段?

【问题讨论】:

  • 你想达到什么目的?
  • @EdHeal 谢谢你的评论。我正在尝试检测服务器端的半开连接,以便从轮询例程中删除死客户端套接字(检查是否有一些数据到达它们)。所以我想向客户端发送没有数据的keepalive数据包,看看它们是否仍然连接。
  • 为什么会出现这个问题?
  • @EdHeal 这是问题所在,因为服务器浪费了处理器时间来轮询永远不会有传入数据的死套接字。
  • @EdHeal,随着新客户端的连接和断开,问题显然会像滚雪球一样增长。

标签: c linux sockets tcp ip


【解决方案1】:

据我所知,Linux 上的系统保持活动超时为两个小时,即 太多了,是一个系统范围的设置,可以被覆盖 如果我将其更改为例如其他应用程序等一下。 ——科柳尼亚

您还可以在此处为每个套接字设置 keepalive 选项。

int true = 1;
int idle = 60;
if (setsockopt(s, SOL_SOCKET,  SO_KEEPALIVE,  &true, sizeof true) < 0
 || setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE,  &idle, sizeof idle) < 0
 || setsockopt(s, IPPROTO_TCP, TCP_KEEPINTVL, &true, sizeof true) < 0   /* 1 s */
   ) perror("setsockopt");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多