【发布时间】:2018-07-04 17:10:43
【问题描述】:
我写C程序的时候一头雾水……
我写的程序是一个客户端程序,它的功能很简单,就是向服务器端发送请求。
我在我的程序中初始化了一个套接字来与服务器通信。我认为我应该做的是在线程结束之前断开并破坏这个连接。否则会导致内存泄漏。因为虽然操作系统会对我的线程进行内存清理,但它只会清理分配给我的程序的内存,我认为套接字不会断开。
但是我发现了一个奇怪的事情......我的程序结束后,从我的服务器端,我使用 -netstat 命令查看端口状态。此套接字将立即关闭,我的服务器超时为 60 秒,我设置了套接字属性的保持活动状态...我尝试在客户端程序中休眠 5 秒,发现套接字保持建立。
我认为在这种情况下,在我的服务器看来,这个套接字不会立即关闭而是等待超时......
那么我客户端的端口释放了吗?谁干的?谁注意到我的服务器断开了这个套接字?我不知道...
那么知道这件事的任何人都可以告诉我一些关于它的事情吗? 非常感谢
【问题讨论】:
-
操作系统没有“垃圾收集”...绝对不是“预线程”...但是,当一个进程终止时,所有附加到该进程的资源都会被释放,包括内存分配,打开文件等'。
-
您的程序无法正确实现 TCP 协议,该协议不允许在没有正确握手的情况下突然中止。正确结束连接是 TCP 中比较复杂的操作之一。您正在看到操作系统负责这项工作。
-
操作系统管理进程资源,而不是线程资源。打开的文件、连接、内存和其他一切都与进程相关联。
-
根据 Netstat,套接字处于什么状态? TIME_WAIT?
标签: c sockets memory-management port tcp-ip