Может ли клиент определить, есть ли на сервере accept () и есть ли сокет unix? - PullRequest
1 голос
/ 30 апреля 2010

Я имею дело с ошибочным сервером, который иногда не может принимать соединения () (но оставляет его слушающий сокет открытым). Это в Linux с доменными сокетами unix.

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

Особенно для доменных сокетов unix кажется, что ядро ​​должно знать, произошло ли accept (); есть ли способ узнать это? Может ли клиент как-то заблокировать, пока accept () не произойдет, или хотя бы проверить, есть ли у него?

Это только для целей отладки, поэтому может быть немного уродливым.

Ответы [ 2 ]

3 голосов
/ 02 ноября 2010

Похоже, ответ на это "нет"; ядро не предлагает никакой возможности получить эту информацию.

(изменение протокола не является ответом, так как я отлаживал ранее существующий неизменяемый протокол)

3 голосов
/ 01 мая 2010

Я бы сказал, что ответом было изменение протокола, чтобы сервер говорил первым (например, SMTP, а не HTTP)

Ядро принимает сокеты еще до того, как будет выполнен системный вызов accept (); если он никогда не прибудет, то сокеты сидят в состоянии ожидания. Нет способа отличить это от сервера, принимающего соединение, но не говорящего. Так всегда работали сокеты BSD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...