一个出现异常CLOSE_WAIT连接的问题

news/2024/5/17 17:38:55 标签: tcp

项目测试过程中出现大量CLOSE_WAIT状态的连接,后来发现是给进程设置的open files数目太少导致。下面还原这个问题。

从网上找了个使用了epoll的 web server,拉取下来后,执行以下命令进行编译:

cd MiniHttpd
cmake .
make

项目用到了zlib和libconfig,如果编译报错,Ubuntu下可以尝试执行以下命令安装:

sudo apt-get install zlib1g-dev
sudo apt-get install libconfig libconfig++-dev libconfig-dev

修改HttpServer.cpp文件:

--- a/src/HttpServer.cpp
+++ b/src/HttpServer.cpp
@@ -77,7 +77,7 @@ void HttpServer::load_config(string path){
     }
     catch(FileIOException io_exception){
         cout<<"Config not found, use default settings"<<endl;
-        port = 0;
+        port = 9999;
         baseURL = "/home/wuyuixn/Webroot";
         request_queue_length = 5;
     }
@@ -138,7 +138,9 @@ void HttpServer::start_listen(){
    while(1){
        int number = epoll_wait(epollfd, events, MAX_EVENT_NUMBER, -1);
        for (int i = 0; i < number; i++){
            int sockfd = events[i].data.fd;

            //处理新到的客户连接
            if (sockfd == server_sock){
                int client_sock = -1;
                struct sockaddr_in client_name;
                socklen_t  client_name_len = sizeof(client_name);
                 client_sock = accept(server_sock,
                         (struct sockaddr *)&client_name,
                         &client_name_len);
+                printf("accept %d\n", client_sock);
                 if (client_sock == -1){
+                    fprintf(stderr, "errno is %d (%s)\n", errno, strerror(errno));
                     Log::log("accept failed",ERROR);
                     continue;
                 }

重新make,执行./Minihttpd,用ls -p pid看一下一共打开了6个文件描述符:

Minihttpd 242544 vbox    0u      CHR  136,4      0t0       7 /dev/pts/4
Minihttpd 242544 vbox    1u      CHR  136,4      0t0       7 /dev/pts/4
Minihttpd 242544 vbox    2u      CHR  136,4      0t0       7 /dev/pts/4
Minihttpd 242544 vbox    3u     IPv4 656642      0t0     TCP *:9999 (LISTEN)
Minihttpd 242544 vbox    4u  a_inode   0,14        0   10277 [eventpoll]
Minihttpd 242544 vbox    5w      REG  253,0      464 1048929 2023-12-03.log

新建一个脚本,内容是ulimit -n 6;./Minihttpd(如果直接在shell里执行,会把当前shell的最大open files设为6),执行该脚本,另起一个终端执行nc 127.0.0.1 9999,就会发现脚本输出:

accept -1
errno is 24 (Too many open files)

但用ss -tp | grep 9999发现已经建立了连接:

ESTAB   0         0                127.0.0.1:9999             127.0.0.1:39320
ESTAB   0         0                127.0.0.1:39320            127.0.0.1:9999     users:(("nc",pid=249546,fd=3))

调用accept时,协议栈已经完成了握手建立了连接,accept只是创建一个文件描述符并和这个连接关联起来。
关掉nc再看:

CLOSE-WAIT   1        0              127.0.0.1:9999           127.0.0.1:39320
FIN-WAIT-2   0        0              127.0.0.1:39320          127.0.0.1:9999

nc进程退出时关闭了socket,发送了FIN并收到了ACK,等待对端发送FIN,所以处于FIN-WAIT-2状态。
Minihttpd进程没有文件描述符关联这个连接,所以没办法调用close,就不会发送FIN,所以会一直处于CLOSE-WAIT状态,直到进程退出。

过了一会,FIN-WAIT-2超时后就只剩下了CLOSE-WAIT了:

CLOSE-WAIT   1        0              127.0.0.1:9999           127.0.0.1:39320

实际上拿来测试的这个Minihttpd本身就有bug,对端主动关闭时,它不会调用close,所以慢慢会出现很多CLOSE-WAIT的连接。

延伸参考:【tcp】关于 TCP FIN_WAIT2状态的一个细节问题


http://www.niftyadmin.cn/n/5234461.html

相关文章

前端笔记(二):CSS 选择器与特性

CSS&#xff08;层叠样式表&#xff09;是一种样式表语言&#xff0c;用于描述HTML或XML文档的呈现方式。它定义了如何在屏幕、纸张或其他媒体上显示文档的样式、布局和外观。 里面的代码由 选择器 { } 组成 体验 CSS CSS 可以让我们界面变得更加美观&#xff0c;这是 CSS 的…

(UM1724) STM32 Nucleo-64 boards User manual

STM32 Nucleo-64 评估板用户手册 0. 前言1. 介绍[^1]2. Ordering information2.1 包装编号说明3. 开发环境4. 跳线端子 ON/OFF 的约定5. 快速入门6. 硬件布局与配置6.10 扩展连接器6.11 ARDUINO 连接器6.12 ST morpho 连接器7. Nucleo-64 评估板信息0. 前言 【相关博文】 【

Python----字典练习

相关链接&#xff1a;Python---字典的增、删、改、查操作_python中字典的增删改查-CSDN博客 Python---字典---dict-CSDN博客 Python---引用变量与可变、非可变类型-CSDN博客 重点&#xff1a; 字典中的 key &#xff08;就是键&#xff09;可以是很多数据类型&#xff08;…

《管家婆》辉煌2005+(V4.0)简单教程

《管家婆》辉煌2005&#xff08;V4.0&#xff09;简单教程 呉師傅 运行环境&#xff1a;   操作系统推荐使用Win2000&#xff08;32位&#xff09;、WinXP&#xff08;32位&#xff09;、Win7&#xff08;位&#xff09; 兼容&#xff1a;Win7&#xff08;64位&#xff09…

禁止谷歌浏览器自动更新

禁止谷歌浏览器自动更新 在使用Python包selenium的时候浏览器版版本发生变化后产生很多问题如&#xff1a; 1、直接版本不对应无法运行 2、版本不一致导致debug启动浏览器超级慢 这里是已谷歌浏览器为代表的。 禁止自动更新的方法如下&#xff1a; 1、WinR调出运行&#x…

数据管理系统-week10-自由访问控制

文章目录 前言一、用户管理用户管理语句介绍二、数据库管理三、特权(重点考点)Administrative (global) privileges数据库特权表权限列权限四、角色参考文献前言 这节课主要讲了用户管理数据库的具体语句,数据库特权当中的全局特权,数据库特权,表特权与列特权的使用与注意…

域名证书(SSL)申请

获取域名证书的步骤如下&#xff1a; 选择认证机构&#xff1a;域名证书必须从受信任的认证机构中申请&#xff0c;如JoySSL、GeoTrust、Thawte等。收集信息&#xff1a;在申请域名证书之前&#xff0c;需要准备一些证明信息&#xff0c;如域名认证、身份证明等。创建CSR&…

C语言——指针(四)

&#x1f4dd;前言&#xff1a; 上篇文章C语言——指针&#xff08;三&#xff09;对指针和数组进行了讲解&#xff0c;今天主要更深入的讲解一下不同类型指针变量的特点&#xff1a; 1&#xff0c;字符指针变量 2&#xff0c;数组指针变量 3&#xff0c;函数指针变量 &#x1…