Подключение Winsock2 с внешнего IP-адреса

Я написал простую программу char с winsock2 на C, используя примеры в msdn. Она работает, если я не пытаюсь подключиться к серверу через компьютер, который не подключен к тому же маршрутизатору (используя внешний адрес сети )

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

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

Есть ли какой-то флаг, разрешающий подключение с внешнего IP?


person Kirill Kulakov    schedule 18.06.2012    source источник
comment
При привязке сокета локального сервера вы используете INADDR_ANY? Какие проблемы возникают при попытке выполнить привязку к внешнему адресу?   -  person Some programmer dude    schedule 18.06.2012
comment
Да, я использую INADDR_ANY для привязки сокета, он работает без проблем. Но я не могу привязать его к своему внешнему IP, получаю ошибку 10049.   -  person Kirill Kulakov    schedule 18.06.2012
comment
То, что вы не можете подключиться извне, скорее всего, проблема с брандмауэром. Вы должны проверить правила и журналы брандмауэра.   -  person Some programmer dude    schedule 18.06.2012
comment
Это кажется очень маловероятным, я пытался включить антивирус, брандмауэр и настроить маршрутизатор как DMZ для моего внутреннего IP-адреса. Более того, я без проблем настроил игровой сервер и подключился к нему (через внешний компьютер).   -  person Kirill Kulakov    schedule 18.06.2012
comment
Вы проверили, на что указывает ошибка 10049? Если нет, вы можете сделать это здесь: msdn.microsoft.com/en-us/library/windows/desktop/   -  person alk    schedule 18.06.2012
comment
Да, проверял, упомянул, что нельзя привязать внешний айпи.   -  person Kirill Kulakov    schedule 18.06.2012


Ответы (1)


Сокет сервера может связываться только с IP-адресами, принадлежащими машине, на которой он работает. Привязка к INADDR_ANY сделает это за вас.

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

Например, предположим, что у вас есть серверный сокет, прослушивающий порт 12345 машины с локальным IP-адресом LAN 192.168.0.1, а маршрутизатор имеет общедоступный IP-адрес 206.152.65.1. Вы должны привязать сокет к 192.168.0.1:12345, затем открыть порт 12345 (или любой доступный порт, который вы хотите) на маршрутизаторе и определить правило переадресации портов, чтобы сопоставить этот порт с 192.168.0.1:12345. Теперь внешний клиент может подключиться к 206.152.65.1:12345, а сервер 192.168.0.1:12345 увидит соединение.

В более общем случае любой сетевой пакет, направленный на адрес 206.152.65.1:12345, будет изменен и перенаправлен на адрес 192.168.0.1:12345. Маршрутизатор заботится о настройке заголовков пакетов, чтобы стороны думали, что общаются друг с другом и не знают, что маршрутизатор находится посередине.

person Remy Lebeau    schedule 19.06.2012