Программа обмена мгновенными сообщениями Python не может подключиться с ошибкой 111

Я пытаюсь реализовать простую программу обмена мгновенными сообщениями TCP в Python, используя модуль сокета. Когда я использую значение, возвращаемое socket.gethostname() в connect(), клиент отлично работает при подключении к серверу обмена мгновенными сообщениями, работающему на локальном хосте. Однако клиент возвращает ошибку 111 (отказ в соединении), когда я использую значение, возвращаемое socket.gethostbyname("localhost"). Есть ли способ решить эту проблему?


person jhunter_d    schedule 03.01.2013    source источник
comment
Вероятно, сервер не прослушивает localhost. Вы можете проверить это с помощью netcat или telnet, например, nc localhost 111. Не зная ничего о вашем сервере, кроме краткого упоминания, невозможно поставить диагноз, но мое первое предположение будет заключаться в том, что вы делаете bind((gethostname(), 111)) вместо bind('', 111) или что-то подобное.   -  person abarnert    schedule 04.01.2013
comment
@abarnert Это сработало! Спасибо!   -  person jhunter_d    schedule 04.01.2013
comment
Ладно, думаю, я превращу это в ответ.   -  person abarnert    schedule 04.01.2013


Ответы (1)


Если вы получаете 111 при попытке connect, это обычно означает, что на этом хосте и порту ничего не прослушивается.

Обычно проще проверить это с помощью однострочника с помощью netcat (который у вас, вероятно, встроен в на любой платформе, кроме Windows, и может быть легко получено, если вы этого не сделаете), или telnet, если необходимо:

abarnert$ nc -v localhost 111
nc: connect to localhost port 111 (tcp) failed: Connection refused
nc: connect to localhost port 111 (tcp) failed: Connection refused
nc: connect to localhost port 111 (tcp) failed: Connection refused

Поскольку netcat не может подключиться, проблема не в вашем клиенте Python, а в том, что не к чему подключаться.

Это означает, что ваш сервер не прослушивает localhost:111.

Не зная ничего о вашем сервере, кроме краткого упоминания, невозможно поставить диагноз, но мое первое предположение будет заключаться в том, что вы выполняете bind((gethostname(), 111)), что означает, что он в конечном итоге прослушивает, скажем, 10.0.0.3:111.

Если вы хотите прослушивать все хосты и интерфейсы, есть причудливые способы указать это, но самый простой способ:

serversocket.bind(('', 111))
person abarnert    schedule 03.01.2013