我的 linux 应用程序端口在停止时被另一个服务占用
My linux application port is taken by another service when it's stopped
我开发了一个包含小型 http 服务器的应用程序。
我的应用程序在开机启动。如果我杀死它(例如 kill -9
),http 服务器端口将被另一个守护进程(来自 broadcom 的 acsd)直接占用。
我用 drop-bear 尝试了相同的行为,但问题没有重现。如果我杀死 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 服务器哪里做错了?
正如我在评论中所说,可能是 OS 仍然从您的可执行文件中看到端口繁忙,因为您杀死了它并且它没有释放资源。
谷歌搜索了一下,我发现 this question 与您的问题类似。
现在看来,问题不在于您的代码,而在于您如何管理 kill..
尝试使用 kill 而不是 kill -9 或尝试捕获 sig 以便可执行文件能够自行释放其资源
因为我的问题没有得到答复。我想与您分享该问题的答案。
acsd 服务占用端口,因为套接字未关闭且选项 SO_REUSEADDR
已设置
我开发了一个包含小型 http 服务器的应用程序。
我的应用程序在开机启动。如果我杀死它(例如 kill -9
),http 服务器端口将被另一个守护进程(来自 broadcom 的 acsd)直接占用。
我用 drop-bear 尝试了相同的行为,但问题没有重现。如果我杀死 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 服务器哪里做错了?
正如我在评论中所说,可能是 OS 仍然从您的可执行文件中看到端口繁忙,因为您杀死了它并且它没有释放资源。
谷歌搜索了一下,我发现 this question 与您的问题类似。
现在看来,问题不在于您的代码,而在于您如何管理 kill..
尝试使用 kill 而不是 kill -9 或尝试捕获 sig 以便可执行文件能够自行释放其资源
因为我的问题没有得到答复。我想与您分享该问题的答案。
acsd 服务占用端口,因为套接字未关闭且选项 SO_REUSEADDR
已设置