Я пытаюсь сделать одноранговое приложение в 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);
Он получает информацию от оглушающего сервера в порядке и ждет другого соединения, но когда я использую эту информацию в своем втором скрипте, первый скрипт все равно не получает никакого сообщения. Есть ли еще один шаг, который мне не хватает?