Intereting Posts
Как изменить динамический тег <title> в php на основе значений URL Динамически добавленные элементы формы не будут размещаться Получите ошибку при использовании skyscanner Api из расчета полет в php Mysql, выберите идентификатор, сгруппированный по отдельному столбцу (выберите все идентификаторы для каждого уникального домена) Как работает подобный_текст? Использовать образец прототипа или нет Как вы показываете свой исходный код php с подсветкой или источником просмотра? Восстановление определенной строки из базы данных в yii Эффективно использовать Google App Engine для отправки большого количества писем с помощью PHP? передовая практика / структура запросов PHP AJAX Как извлечь изображение из pdf-файла, используя php Нужна помощь в PHP-петле Запуск PHP: невозможно инициализировать модуль Извлечение SimpleXMLElement PHP PHP регулярное выражение для ливанского номера телефона

Как сделать NAT с сокетами PHP

Я пытаюсь сделать одноранговое приложение в php для работы таким же образом, как работает skype. Он работает с внутренними адресами, но когда я пытаюсь отправить данные на мой внешний адрес, сообщение никогда не попадает туда. Очевидно, что мне не хватает перевода адреса, но я не понимаю, как это сделать с сокетами PHP. Является ли это возможным?

Это код, который я имею на данный момент, чтобы получить сообщение, которое я запускаю первым, чтобы дождаться сообщения:

<?php $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket: " . socket_strerror(socket_last_error($socket))); socket_bind($socket, "0.0.0.0", 100) or die("Could not bind socket: " . socket_strerror(socket_last_error($socket))); $ret = ""; $from_ip = ""; $from_port = 0; echo "waiting...\n"; socket_recvfrom($socket, $ret, 6, 0, $from_ip, $from_port); var_dump($ret, $from_ip, $from_port); socket_close($socket); 

И затем, когда он ждет, я запускаю этот код для отправки сообщения:

 <?php $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket: " . socket_strerror(socket_last_error($socket))); $to_ip = "externalip"; //works with internal "127.0.0.1"; $to_port = 100; $message = "hello!"; socket_sendto($socket, $message, strlen($message), 0, $to_ip, $to_port); echo "sent\n"; socket_close($socket); 

Но он отправляет и выезжает, но первый скрипт все еще ждет … Это было какое-то время, может ли кто-нибудь помочь мне?

— Редактировать —

Хорошо, поэтому я реализовал оглушающий сервер и настроил для него переадресацию портов следующим образом:

 <?php echo "-- STUN SERVER --\n"; $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket: " . socket_strerror(socket_last_error($socket))); socket_bind($socket, "0.0.0.0", 5104) or die("Could not bind socket: " . socket_strerror(socket_last_error($socket))); do { $ret = ""; $from = ""; $port = 0; echo "waiting...\n"; socket_recvfrom($socket, $ret, 6, 0, $from, $port); echo "received: $ret\n"; $message = $from.":".$port; socket_sendto($socket, $message, strlen($message), 0, $from, $port); echo "sent: $message\n\n"; } while (true); 

и изменил мой первый скрипт, чтобы получить его ip / port от оглушающего сервера:

 <?php $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Could not create socket: " . socket_strerror(socket_last_error($socket))); socket_bind($socket, "0.0.0.0", 100) or die("Could not bind socket: " . socket_strerror(socket_last_error($socket))); $ret = ""; $from = ""; $port = 0; echo "sending info to stun server...\n"; $to_ip = "stunip"; $to_port = 5104; $message = "get_ip"; socket_sendto($socket, $message, strlen($message), 0, $to_ip, $to_port); echo "waiting for stun...\n"; $stuninfo = ""; socket_recvfrom($socket, $stuninfo, 25, 0, $from, $port); var_dump($stuninfo); // i use this info in my second script echo "waiting...\n"; socket_recvfrom($socket, $ret, 6, 0, $from, $port); var_dump($ret, $from, $port); socket_close($socket); 

Он получает информацию от оглушающего сервера в порядке и ждет другого соединения, но когда я использую эту информацию в своем втором скрипте, первый скрипт все равно не получает никакого сообщения. Есть ли еще один шаг, который мне не хватает?

Solutions Collecting From Web of "Как сделать NAT с сокетами PHP"