Мой порт приложения linux занят другим сервисом, когда он остановлен

Я разработал приложение, которое содержит небольшой http-сервер.

мое приложение запускается в загрузке. Если я убью его (с kill -9 например), порт http-сервера будет напрямую занят другим демоном (acsd из broadcom).

Такое же поведение я пробовал с 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-сервере?

-2

Решение

Как я сказал в комментарии, это может быть тот факт, что ОС все еще видит, что порт занят вашим исполняемым файлом, потому что вы убили его, а ресурс не освободил.

Погуглив немного я нашел этот вопрос это похоже на то, что ваша проблема.

Теперь кажется, что проблема не в вашем коде, а в том, как вы управляете уничтожением ..

Попробуйте использовать kill вместо kill -9 или попробуйте перехватить sig, чтобы исполняемый файл мог самостоятельно освобождать свои ресурсы

-1

Другие решения

так как у меня нет ответа на мой вопрос. Я хотел бы поделиться с вами ответом на эту проблему.

Служба acsd берет порт, потому что сокет не закрыт и опция SO_REUSEADDR установлено

-2

По вопросам рекламы [email protected]