Можно ли разлочить на сокете? - PullRequest
13 голосов
/ 02 октября 2008

Можно ли не прослушать сокет после того, как вы вызвали listen (fd, backlog)?

Редактировать: Моя ошибка в том, что я не прояснил себя. Я хотел бы иметь возможность временно не прослушать сокет. Вызов close () оставит сокет в состоянии M2LS и предотвратит его повторное открытие (или, что еще хуже, к этому сокету может быть привязана какая-то вредоносная программа)

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

Ответы [ 11 ]

0 голосов
/ 03 октября 2008

На базовом уровне сокеты либо открыты, либо закрыты (здесь мы будем игнорировать тонкости диаграммы состояний TCP / IP).

Если ваш сокет закрыт, то ничто не может отправить в него данные. Если он открыт, то входящие данные будут приниматься и подтверждаться стеком TCP / IP до тех пор, пока алгоритм буферизации не выдает «достаточно!». В этот момент дальнейшие данные не будут подтверждены.

У тебя есть два варианта, которые я вижу. Либо закройте () сокет, если вы хотите «отменить прослушивание», и откройте его позже - используйте setsockopt () с флагом SO_REUSEADDR, чтобы позволить вам выполнить повторную привязку к известному порту до истечения времени TIME_WAIT2.

Другой вариант - оставить сокет открытым, но просто не принимать от него (), пока вы «заняты». Предполагая, что у вас есть подтверждение на уровне приложения для запросов, вы балансировщик нагрузки поймете, что он не получает ответ и действовать соответствующим образом.

...