сокет домена "sendto" столкнулся с "errno 111, отказано в соединении" - PullRequest
7 голосов
/ 18 мая 2010

Я использую доменный сокет, чтобы получить значения из другого процесса, например, A, чтобы получить значение из B, Это хорошо работает в течение месяцев Но недавно произошел сбой A во время сообщения «sendto» для B с ошибкой «111, соединение отказано».

Я проверил файл привязки сокета домена B, он существует. Я также делаю некоторые тесты на другой машине, также хорошо работает. Итак, кто-нибудь сталкивался с этой проблемой раньше? Может у кого-нибудь есть подсказки, что может быть не так в этом сценарии? Большое спасибо.

Ответы [ 4 ]

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

Когда я видел эту ошибку с доменными сокетами Unix, обычно это происходит из-за того, что процесс B не запущен или существует несоответствие в путях подключения.(Если B умирает, он автоматически перезапускается? Возможно ли, что сбои происходят, когда B умер, но еще не перезапущен?).Другая возможность: возможно ли, что несколько копий A работают одновременно?Вы можете получить ошибку ECONNREFUSED, если очередь B еще не принятых соединений заполнена.

Я бы предложил запустить оба процесса A и B в режиме strace, либо:

strace -o A.log A

или, если процесс уже запущен,

strace -o B.log -p <process-id-of-B>

Кроме того,

netstat -na

предоставит вам статус всех сокетов домена unix, присутствующих в системе.

2 голосов
/ 11 сентября 2010

Попробуйте заглянуть под /proc/<pid-B>/fd и посмотреть, не заканчивается ли B дескрипторов файлов.Если это так, у вас есть утечка ресурсов, и вам нужно исправить.Это не должно быть проблемой с программами UDP, но более забавные вещи были известны.lsof может быть другим инструментом для использования.

В противном случае у вас есть разумные предложения от других людей - в частности, netstat должно помочь.

1 голос
/ 11 сентября 2010

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

0 голосов
/ 11 сентября 2010

Процесс B больше не находится на другой стороне вашего (предположительно DGRAM) сокета - возможно, он умер или закрыл дескриптор файла и т. Д.

sendto(2) в linux вернет ECONNREFUSED для сокета домена Unix SOCK_DGRAM или SOCK_SEQPACKET, если принимающая сторона мертва. (Unix-сокеты SOCK_STREAM этого не делают - вместо этого они возвращают ENOTCONN.)

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