2013-12-02 2 views
0

У меня есть программа сервера, которая выглядит следующим образомЗакрытие сокета сервера в C Linux

{ 
    socket(); 
    bind(); 
    listen(); 

    while(1) 
    { 
     accept(); 
     recv(); 
     send(); 
     close(); 
    } 

    close(); 
} 

Допустим, что сервер работает, вслушиваясь в указанном порту. Как я могу закрыть его, нажав на клавиатуру? Я имею в виду правильное закрытие, а не Ctrl + C.

+0

Как @guido сказал, что вы можете [опросить разъем для соединений] (http://stackoverflow.com/questions/14045064/how-to-accept-socket-with-timeout). – Basilevs

ответ

1

Когда вы close() сокет, который блокируется в accept(), тогда звонок accept() будет немедленно возвращен с -1.

Если ваша программа одинарная, как вы показываете, то вы не можете сделать выше. Вам нужно будет ввести хотя бы один дополнительный поток, чтобы на самом деле сделать close().

+1

Либо это, либо использовать epoll/select to multiplex stdin и socket. – Guido

+0

Вы можете позволить libc/OS внушительно ввести «дополнительный поток», сигнализируя о программе. – alk

+0

@Guido, сделайте свой ответ – Basilevs

0
  1. Есть программа установки обработчика сигнала (для SIGUSR1, например) ничего не делает.

  2. Используйте setsockopt(), чтобы отключить опцию SA_RESTART для использования в розетках.

  3. Сделать связанный сокет кода системы выдачи вызовов в виде, что они могут вернуться с -1 и errno набором для EINTR.

  4. Запустить программу.

  5. Отправьте ему сигнал, для которого программа имеет установленный обработчик (в 1.) снаружи (например, с помощью команды kill <pid> -USR1).

  6. Обнаружить прием сигнала (см. 3.) и отреагировать, например, на close() с данным гнездом.

Смежные вопросы