【问题标题】:Best practices for Linux socket programmingLinux 套接字编程的最佳实践
【发布时间】:2013-12-02 17:18:41
【问题描述】:

我有一个简单的 C 服务器,它接受我尝试使用 telnet 或 netcat 连接的连接。每次收到连接时,我都会打印出描述符并在子进程中关闭连接。

我运行一个 netcat 实例,连接到服务器,断开连接(Ctrl^C),然后重复几次。在服务器端打印的描述符上使用的值是 4,5,6,7 .. 并且继续增加。

我尝试在一段时间后重复此练习,但值仍在不断增加。我担心我的描述没有结束(尽管明确调用关闭)。

是否有一些我应该处理的信号,将处理程序设置为关闭连接?

【问题讨论】:

    标签: linux sockets network-programming


    【解决方案1】:

    fork 之后,子进程拥有一组复制的父文件描述符。所以正确的程序是,在 fork 之后,(1) 关闭子级中父级的 listening 套接字和 (2) 关闭子级继承的新 connection 套接字在父级中。

    打开的文件描述符被内核引用计数。因此,当子级继承连接套接字时,引用计数为 2。父级关闭连接套接字后,计数保持为 1,直到子级完成并关闭它。然后引用计数下降到 0,然后关闭连接。 (省略了一些细节。)

    结果是,在进行此更改后,您会在父级中看到许多等于 4 的 FD,因为即使子级正在处理多个连接,同一个 FD 仍将继续打开/关闭/重用。

    【讨论】:

      【解决方案2】:

      在 fork 之后,父子节点都有一个套接字文件描述符的副本;

      你应该在 fork 之后关闭父进程中的套接字。 现在不会关闭连接,只有当子进程也关闭套接字时,才会关闭连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 2011-06-29
        • 2011-08-12
        • 1970-01-01
        • 2016-04-19
        相关资源
        最近更新 更多