如何长时间正确维护监听端口?

Hav*_*ard 12 c sockets daemon

我用纯C编写了这个小型服务器应用程序,它监听给定端口中的传入连接,这非常简单.

它与通常的套接字初始化过程一致,创建socket()然后bind()到端口,说它的a listen(),并且ifinitely循环select()等待传入的连接accept().

一切都很好,就像一个魅力,除了如果我让事情运行几个月,监听端口关闭,而应用程序服务器不知不觉地运行,因为我写它信任监听套接字不会关闭,如果没告诉.

所以问题是:为什么在没有我的应用程序关注的情况下关闭端口,我该怎么做以防止它发生?

这是预期的行为吗?我应该检查某种异常还是在监听套接字上进行"健康检查",以便在必要时重新打开它?

代码:https://gist.github.com/Havenard/e930be035a3bee75c018(是的,我知道我正在使用它0作为错误的提示,这是不好的实践和东西,但它与我在评论中解释的问题无关,当时我设置套接字文件描述符0是为了停止循环并关闭应用程序).

wil*_*ser 6

我会从清理它开始:

  • 将其切割成更小,可读,可验证,可测试的功能
  • 链表用法看起来很乱; 它可以简化很多,可能通过引入一些通用函数.
  • 用更可读的"等价物"替换所有愚蠢的'\ x20'字符常量
  • 避免像这里一样明显的魔术常数if (n_case > 0) memcpy(nick, node->nick, (n_case > 32 ? 32 : n_case));; sizeof是你的朋友.
  • 不要将零用作未使用文件描述符的标记值; 用-1代替.
  • 使用无符号类型的大小和索引; 负索引会破坏内存,折叠无符号类型会快速失败.(failfast是你的朋友)

这只是几个小时的编辑.

我的猜测是,在清理/重构后,你的"虫子"会神奇地浮出水面.

脚注:不,我不会为你做你的工作.不是100分,不是1000分.请清理你自己的烂摊子.