У меня проблема с программированием сокетов. В настоящее время я пишу простое приложение сервер / клиент, которое запрашивает подключение клиентов для ответа на опрос (я следую упражнениям в книге: Сокеты 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-адрес к моему хосту, но я не думаю, что он мне понадобится, сейчас он работает нормально, надеюсь, это не вызовет никаких проблем.