2012-06-18 5 views
0

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

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

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

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

+0

При привязке к локальному серверному сокету вы используете 'INADDR_ANY'? Какие проблемы возникают при попытке привязки к внешнему адресу? –

+0

Да, я использую INADDR_ANY для привязки сокета, он работает без проблем. Но я не могу связать его с внешним IP-адресом, я получаю сообщение об ошибке 10049. –

+0

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

ответ

0

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

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

Например, скажем, что у вас есть сокет сервера, прослушивающий порт 12345 машины с локальным IP-адресом сети 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. Маршрутизатор заботится о настройке заголовков пакетов, поэтому стороны считают, что они общаются друг с другом и не знают, что маршрутизатор находится посередине.