我的 linux 应用程序端口在停止时被另一个服务占用

My linux application port is taken by another service when it's stopped

本文关键字:另一个 服务 应用程序 linux 我的      更新时间:2023-10-16

我开发了一个包含小型http服务器的应用程序。

我的应用程序在启动中启动。如果我杀死它(例如kill -9),http服务器端口将由另一个守护进程(来自broadcom的acsd)直接占用。

我用 drop-bear 尝试了相同的行为,但问题没有重现。如果我杀死了下降熊,ACSD不会占用它的端口。

在我的服务器代码之后:

void http_server_init(void)
{
    struct sockaddr_in server;
    int cr_port;
    for(;;) {
        cr_port = conf.port;
        int i = (DEFAULT_PORT == cr_port)? 1 : 0;
        //Create socket
        cr_socket_desc = socket(AF_INET , SOCK_STREAM , 0);
        if (cr_socket_desc == -1)
        {
            LOG (ERROR,"Could not open server socket, Error no is : %d, Error description is : %s", errno, strerror(errno));
            sleep(1);
            continue;
        }
        /* enable SO_REUSEADDR */
        int reusaddr = 1;
        if (setsockopt(cr_socket_desc, SOL_SOCKET, SO_REUSEADDR, &reusaddr, sizeof(int)) < 0) {
            LOG (WARNING,"setsockopt(SO_REUSEADDR) failed");
        }
        //Prepare the sockaddr_in structure
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        for(;;i++) {
            server.sin_port = htons(cr_port);
            //Bind
            if( bind(cr_socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
            {
                //print the error message
                LOG (ERROR,"Could not bind server socket on the port %d, Error no is : %d, Error description is : %s", cr_port, errno, strerror(errno));
                cr_port = DEFAULT_PORT + i;
                LOG (INFO,"Trying to use another port: %d", cr_port);
                continue;
            }
            break;
        }
        break;
    }
    LOG (INFO,"server initiated with the port: %d", cr_port);
}

我在 http 服务器中做错了什么?

正如我在评论中所说,可能是操作系统仍然看到可执行文件中的端口繁忙,因为您杀死了它并且它没有释放资源。

谷歌搜索一下,我发现这个问题与您的问题相似。

现在,问题似乎不在于你的代码,而在于你如何管理杀戮。

尝试使用 kill 而不是 kill -9,或者尝试捕获 sig,以便可执行文件能够自行释放其资源

因为我的问题没有答案。我想与大家分享对这个问题的回应。

acsd 服务采用端口,因为套接字未关闭且选项SO_REUSEADDR已设置

相关文章: