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

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

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

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

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

<?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 / порт с сервера оглушения:

<?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);

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

0 ответов

Другие вопросы по тегам