Сокет приложение не работает через интернет - PullRequest
1 голос
/ 27 июня 2011

У меня проблема с программированием сокетов. В настоящее время я пишу простое приложение сервер / клиент, которое запрашивает подключение клиентов для ответа на опрос (я следую упражнениям в книге: Сокеты TCP / IP в C: Практическое руководство для программистов). Он отлично работает в моей локальной сети (используя localhost для подключения), но я не могу заставить его работать через Интернет. Поскольку я изменил часть кода, найденного в книге, я попытался скомпилировать исходный код из книги, но он все еще не работает. Я предполагаю, что это не проблема кода, а проблема сети. Я провел некоторое исследование и поэтому отключил свой брандмауэр, я перенаправил порт, который я использую (12543) в своем маршрутизаторе, но он все еще не работает ... У меня есть удаленный сервер Windows, работающий под управлением Windows 7 для тестирования: когда я запускаю на нем свой сервер и пытаюсь подключиться с моего компьютера, происходит сбой, когда я пытаюсь запустить свой сервер с моего компьютера и пытаюсь подключиться с удаленного сервера Windows: снова происходит сбой. Даже когда я запускаю свой сервер на своем компьютере и пытаюсь подключиться к клиенту с того же компьютера, используя мой частный IPv4-адрес 192.168.x.x или мой общедоступный, это не удается! О, и на сервере Windows не работает брандмауэр.

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

Исходный код можно найти здесь: http://cs.ecs.baylor.edu/~donahoo/practical/CSockets2/textcode.html (SurveyServer2.cpp, SurveyClient2.cpp, SurveyCommon.h), но я не думаю, что это проблема кода. Пожалуйста, скажите мне, если это не достаточно ясно. И извините, если я допустил некоторые грамматические ошибки, я француз!

Любая помощь будет оценена, спасибо!

РЕДАКТИРОВАТЬ: Хорошо, я знаю, что происходит: это проблема совместимости между IPv4 и IPv6! Это еще не работает должным образом, но теперь я знаю, что исправить. Спасибо всем:)

ВТОРОЕ РЕДАКТИРОВАНИЕ: Ну, я думаю, я наконец понял. Я связывал свой сервер с IPv6-адресом, но хост, на котором работает мой сервер, имеет только публичный IPv4-адрес. Когда я попытался подключиться, разрешение DNS вернуло только адрес IPv4, поэтому я не смог подключиться к своему серверу. Я сказал getaddrinfo, чтобы он возвращал только адреса IPv4, так что теперь он связывается с адресом IPv4 и работает нормально.

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

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Код использует getaddrinfo и ему нужно имя хоста, а не IP-адрес.

0 голосов
/ 28 июня 2011

Похоже, у вас проблема с подключением или проблема с DNS.

Убедитесь, что разрешение имен работает:

Введите 'ping server_NAME' в командной строке клиентского компьютера. Если он не может найти IP-адрес для имени сервера, это может быть вашей проблемой.

Обеспечить связь:

В командной строке сервера:

введите 'netstat -an -p TCP'. Это покажет список всех прослушивающих программ и их номера портов. Вы должны увидеть, что ваш сервер прослушивает порт 12543.

На машине, где вы запускаете свою клиентскую программу:

Используйте telnet, чтобы узнать, сможете ли вы дозвониться до сервера. Вы можете установить номер порта, который использует telnet, с помощью параметра командной строки. Обычно что-то вроде 'telnet -p 12543 server-ip'. Если он говорит «отказано в соединении», значит, есть проблема с подключением (брандмауэр и т. Д.). Если он открывает соединение, вы не получите сообщение об ошибке, и вы сможете набирать текст для отправки на сервер. Вы действительно заботитесь только о том, чтобы telnet смог установить здесь соединение TCP.

Если Telnet все-таки подключается, то проблема заключается в связи между программами, а не в сети.

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