Серверный сокет может привязываться только к 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. Маршрутизатор заботится о настройке заголовков пакетов, поэтому стороны считают, что они общаются друг с другом и не знают, что маршрутизатор находится посередине.
При привязке к локальному серверному сокету вы используете 'INADDR_ANY'? Какие проблемы возникают при попытке привязки к внешнему адресу? –
Да, я использую INADDR_ANY для привязки сокета, он работает без проблем. Но я не могу связать его с внешним IP-адресом, я получаю сообщение об ошибке 10049. –
То, что вы не можете подключаться извне, скорее всего, является проблемой межсетевого экрана , Вы должны проверить правила и журналы брандмауэра. –