【问题标题】:Does TCP/IP connection automatically closed when OS do a garbage collection after a thread end?当操作系统在线程结束后进行垃圾收集时,TCP/IP 连接是否会自动关闭?
【发布时间】:2018-07-04 17:10:43
【问题描述】:

我写C程序的时候一头雾水……

我写的程序是一个客户端程序,它的功能很简单,就是向服务器端发送请求。

我在我的程序中初始化了一个套接字来与服务器通信。我认为我应该做的是在线程结束之前断开并破坏这个连接。否则会导致内存泄漏。因为虽然操作系统会对我的线程进行内存清理,但它只会清理分配给我的程序的内存,我认为套接字不会断开。

但是我发现了一个奇怪的事情......我的程序结束后,从我的服务器端,我使用 -netstat 命令查看端口状态。此套接字将立即关闭,我的服务器超时为 60 秒,我设置了套接字属性的保持活动状态...我尝试在客户端程序中休眠 5 秒,发现套接字保持建立。

我认为在这种情况下,在我的服务器看来,这个套接字不会立即关闭而是等待超时......

那么我客户端的端口释放了吗?谁干的?谁注意到我的服务器断开了这个套接字?我不知道...

那么知道这件事的任何人都可以告诉我一些关于它的事情吗? 非常感谢

【问题讨论】:

  • 操作系统没有“垃圾收集”...绝对不是“预线程”...但是,当一个进程终止时,所有附加到该进程的资源都会被释放,包括内存分配,打开文件等'。
  • 您的程序无法正确实现 TCP 协议,该协议不允许在没有正确握手的情况下突然中止。正确结束连接是 TCP 中比较复杂的操作之一。您正在看到操作系统负责这项工作。
  • 操作系统管理进程资源,而不是线程资源。打开的文件、连接、内存和其他一切都与进程相关联。
  • 根据 Netstat,套接字处于什么状态? TIME_WAIT?

标签: c sockets memory-management port tcp-ip


【解决方案1】:

取决于情况一旦进程结束内核将​​发送连接关闭消息,如果假设内核没有得到响应,它将进入时间等待状态并保持几分钟。如果得到响应,连接将立即关闭。基本上在你的情况下,你得到了响应,这就是为什么套接字正在关闭。采取 tcpdump 并检查你会知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多