Программирование сокетов для выхода из локальной сети на C

#c #sockets #networking

#c #Сокеты #Сеть

Вопрос:

Я хочу отправлять данные по сети на определенную цель (ноутбук), поэтому у меня есть общедоступный IP-адрес цели, например 2.133.167.57, частный IP-адрес адаптера: 192.168.1.1 и MAC: CC: AB: C2:18:72:63 и конкретная цель прослушивает мое соединение; насколько я знаю, для подключения к определенной цели нам нужен общедоступный IP, частный IP (возможно), MacAddress.

Я проверил свой общедоступный IP-адрес, используя как свой ноутбук, так и телефон в https://www.whatismyip.com и оба они были такими же, как и должно быть (насколько я не использовал для них VPN-сервисы). давайте посмотрим на struct sockaddr_in:

 struct sockaddr_in {
    sin_family;
    sin_port;
    sin_addr;
}
  

Модем, к которому подключена моя цель, имеет один общедоступный IP-адрес, и есть несколько устройств, которые используют этот общедоступный IP-адрес (давайте рассмотрим, что они не используют VPN), поэтому, если я введу только общедоступный IP-адрес цели в sin_addr, он не будет отправлен моей цели, и теперь мне нужно добавить MAC-адрес.адрес или частный IP-адрес адаптера, чтобы сделать соединение более точным, но как?

Как я могу добавить в дополнение к общедоступному IP, MAC или частному Ip?

Какую функцию или структуры я должен использовать для установления соединения между двумя ноутбуками в разных сетях?

Комментарии:

1. То, что вы пытаетесь сделать, не сработает. Вам нужно настроить переадресацию портов в вашем NAT.

2. похоже на общую вычислительную проблему. Это не может быть исправлено только на C

3. @tkausl спасибо, mate.it очень помогло, но вопрос: почему для соединения между двумя ноутбуками требуется переадресация портов, но при подключении к серверам мы ее не используем?

4. Потому что маршрутизаторы не находятся за NAT. Ваша домашняя сеть имеет один и только один общедоступный IP-адрес, доступ к которому осуществляется через ваш маршрутизатор (NAT), серверы имеют свой собственный общедоступный IP-адрес и подключены непосредственно к Интернету.

Ответ №1:

насколько я знаю, для подключения к определенной цели нам нужен общедоступный IP, частный IP (возможно), MacAddress

Нет. Если вы хотите установить TCP-соединение, вам нужен только один IP-адрес и номер порта. В любом случае у вас нет прямого способа указать вторичный (частный) IP или mac-адрес в connect вызове.

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

Комментарии:

1. Чтобы уточнить, «явное указание передавать вызовы на определенный порт на конкретный компьютер» обычно означает, что владелец шлюзового устройства должен войти в графический интерфейс настроек шлюзового устройства и вручную настроить переадресацию портов для указанного порта (т. Е. Обычно это не то, что можно сделать программно)