Есть такая замечательная функция как socket_getsockname
Но проблема в том, что если машина на которой исполняется скрипт находится за натом, socket_getsockname возвращает локальный IP адрес, а не натовский.
Какие будут предложения по решению данной траблы?
кстати перед выполнением socket_getsockname использую вот такое:
$fd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($fd, '0.0.0.0');
socket_connect($fd, 'example.com', '12345');
Естественно socket_getsockname дергаю уже после подключения, иначе он вернет 0.0.0.0
На машине много IP адресов и маршрутизация очень разнообразна до example.com может ходить с адреса 192.168.0.34 а на example.net через 10.10.10.63 а на example.ru через 10.10.20.44
При этом:
192.168.0.34 до example.com ходит без ната.
10.10.10.63 до example.net ходит через нат, 10.10.10.1
10.10.20.44 до example.ru маскарадится в 192.168.0.1 потом маскарадится в 10.10.10.1
Есть идеи? :D
Спустя 44 минуты, 56 секунд (10.04.2012 - 14:46) I++ написал(а):
Ох... ладно пойду исходники курить одной проги, может смогу из С++ перевести в PHP. Если, что нарою отпишусь!
Спустя 12 минут, 5 секунд (10.04.2012 - 14:58) I++ написал(а):
Кароче покурил исходник одной проги, там юзается http://checkip.dyndns.com
Вот так и узнается внешний IP
Вот так и узнается внешний IP

Спустя 25 минут, 23 секунды (10.04.2012 - 15:24) killer8080 написал(а):
I++
тебе нужно было определить ip example.com? В смысле домена к которому конектишься?
тебе нужно было определить ip example.com? В смысле домена к которому конектишься?
Спустя 1 час, 47 минут, 20 секунд (10.04.2012 - 17:11) I++ написал(а):
Нет свой локальный (внешний, который в интернетах виден), я прикрутил нужный функционал, просто пинаю dyndns парсю и вуаля. Потом сравниваю, при конекте, что выдает сокпирнэйм и то, что получил с dyndns и таким образом узнаю, за натом я или нет.
Спустя 4 часа, 14 минут, 38 секунд (10.04.2012 - 21:26) killer8080 написал(а):
Цитата (I++ @ 10.04.2012 - 17:11) |
Потом сравниваю, при конекте, что выдает сокпирнэйм и то, что получил с dyndns и таким образом узнаю, за натом я или нет. |
Ничего не понял. Сам же говорил, что маршрутизация сложная
Цитата (I++ @ 10.04.2012 - 14:01) |
При этом: 192.168.0.34 до example.com ходит без ната. 10.10.10.63 до example.net ходит через нат, 10.10.10.1 10.10.20.44 до example.ru маскарадится в 192.168.0.1 потом маскарадится в 10.10.10.1 |
Что тебе даст dyn.dns, если ты не знаешь через какой шлюз пойдут пакеты?
PS у тебя там что, куча сетевых интерфейсов?