2013-10-07 2 views
0

(Я не ставил код в этом вопросе, так как фактический код, вероятно, не имеет значения здесь. Если вы скажете, что это действительно так, то я могу отредактировать вопрос позже, чтобы поместить его.)Winsock2 нелокально отказался

Я новичок в использовании winsock2 или любого другого сетевого API. У меня очень простое серверное приложение и клиентское приложение, в котором сервер отправляет строку клиенту, а затем отключается.

Приложения работают хорошо, когда я использую localhost или 127.0.0.1 как inet_addr() аргумент, но когда я использую мой «реальный» IP, клиентское приложение просто получает WSAECONNREFUSED и сервер не видит его. Я убедился, что для обоих приложений один и тот же порт, и тот же протокол.

[Изменить] Я вернулся к этому вопросу после некоторого отказа от работы в сети. Я думаю, что на самом деле это может быть связано с тем, что я использую маршрутизатор, а не что-то в своем коде.

ответ

1

WSAECONNREFUSED является активным отказом от соединения со стороны партнера или промежуточным межсетевым экраном. Если это был тот, кто его выдал, это означает, что у вас неправильный IP-адрес или порт, иначе вы его правильно, но сервер фактически не работает; во всяком случае, ничто не слушает в этом IP-порту. Если это был брандмауэр, настройте его.

Вы использовали htons() на номер порта?

+0

Использование сетевого анализатора (tcpdump, wireshark и т. Д.) На любом из них или на обоих хостах может показать, что является корнем проблемы. –

+0

Да, я использовал 'htons()', и я использовал свой собственный IP-адрес во время работы сервера (и я проверил с помощью 'localhost' и' 127.0.0.1', чтобы убедиться, что сервер работал правильно). Я добавил правило на свой брандмауэр, чтобы всегда разрешать вход и выход на этом порту (и перемещал правило вверху), но это первый раз, когда я когда-либо использовал эту функцию брандмауэра, поэтому я не уверен, что я сделал это правильно. – rsethc

+0

Также порт не должен иметь значения, поскольку я ничего не менял о порте на клиенте или сервере между попытками с локальным адресом, а затем использовал свой «реальный» IP. – rsethc

0

inet_addr() работает только со строками IP-адрес, вы должны использовать gethostbyname() или getaddrinfo() разрешить localhost или любой другой имя хоста строку в IP-адрес.

WSACONNREFUSED означает, что соединение было активно отклонено на удаленном конце, к которому вы пытаетесь подключиться.

Если серверная машина отказывается, это означает, что на запрошенном IP-порту отсутствует прослушивание сокетов, или что есть одна, а очередь ожидающих клиентских подключений заполнена, поэтому в этот момент он не может принять новое соединение ,

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

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

В любом случае, клиент не может знать код, почему соединение было отклонено. Все, что он может сделать - это подождать некоторое время, а затем повторить попытку.

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