создание сокета к пользователю и отправка ему данных. Лок. сеть.

Regen

Новичок
создание сокета к пользователю и отправка ему данных. Лок. сеть.

Доброе утро.
У меня вопрос заключается вот в чём.
Как создать сокет к определённому IP-адрессу я знаю. Но вот как быть если пользователь запустил скрипт и он сидит в инете через лок. сеть? Т.е. выход в инет происходит через сервак. В этом случае насколько я понимаю
PHP:
extract($HTTP_SERVER_VARS); 
echo getenv("REMOTE_ADDR");
выдаст IP сервера и поэтому попытка сделать сокет на этот IP не принесёт ничего, т.к. сервак не будет этого ждать. Как быть? Решил посмотреть в сторону закачки файлов (закачка идёт как мне думается способом: определение IP-клиента -> отправка файла на определённый IP. Это как раз почти что мне надо. Ведь тут IP определяется однозначно. Хотя может быть я чего-то не понимаю.). Помогите пожалуйста разобраться.
Заранее спасибо за ответы.
 

440hz

php.ru
а можно полюбопытствовать зачем сокет к клиенту? может он совсем не хочет что б к нему сокеты шли? и зафильтровал там себя все, что можно.

=)

p.s. если он за NAT сидит, так ты ваще его не увидишь.
 

Regen

Новичок
1) почему необходимо - это уже второстепенно.
2) если это необъходимо для помощи то опишу что необходимо в глобальном смысле:
Есть Java-приложение (GUI). Самописное. Что-то типа средства онлайн заказа и поиска информации от фирмы.
Есть сервер фирмы
При первом запуске приложение коннектится к серваку через скрипт, создаётся сессионный ключ, на этом ключе шифруется весь последующий трафик.
Вот я и спрашиваю как получить данные от сервака, если приложение было запущено на машине которая в локалке.
Ведь это реализованно во многих приложениях....
Если есть иеди как обойти сокетнеое соединение, то пожалуйста.
P.S. E-mail и посылка туда ключа - не предлагать. Потому что ключ этот нигде не должен светится.
 

440hz

php.ru
Regen

ИМХО:

на соклько я понял инициатором сокета является приложение. тогда серверу пофиг откуда пришло. он просто слушает на нужном порту и отвечает.

если сокет закрывается и сервер должен потом установить соединение с приложением на клиенте, то во многих (в большинтве) случаях это будет нвозможно.
 

Regen

Новичок
Да. Инициатором является приложение. Но сервер же отвечать должен на порт и IP вызвавшего его клиента. Так? Вроде так.
А если так, то как будет происходить отправка данных за NAT?
Или это уже работа сервака? (т.е. перенаправка потока данных на конкретную машину)
 

440hz

php.ru
Regen

сервер слушает сокет, получает в него данные и отвечает, а все остальное пусть тебя не тревожит. если клиент до тебя достучался, то и ответ с большой вероятностью получит.
 

Regen

Новичок
Так.
1) А что будет если два пользователя из сетки попробуют обратиться к серваку. IP будет один и тот же (сервера). Если порт будет тоже один и тот же - то что будет то? Апокалипсис? Или всё нормально?
2) Вот примерная схема соединения. (на мой взгляд)
- на стороне приложение создаётся серверный сокет. Этот сокет допустим слушает на порту N. Затем происходит вызов скрипта на серваке, скрипт получает IP, порт N и затем обращается по IP и N.
- срабатывает accept на серверном сокете, bind, соединение устанавляивается и данные могут ходить в обе стороны. Я прав в своих раскладках?
 

440hz

php.ru
Regen
ты почитай поподробнее как сокеты работают и вообще про TCP/IP.
=)

я не понял про какой срипт ты говоришь и когда он запускается? по идее скрипт должен висть постоянно и слушать, а не запускаться по желанию.

вот примерная схема соединения на мой взгляд.

1. на сервере постоянно висит скрипт и слушает сокет.
2. к нему коннектятся клиенты.
3. скрипт разруливает на уровне сокета кому и что отвечать.

http://php.ru/manual/ref.sockets.html
вот тут (да и не только тут) есть конкретнй пример сервер/клиентов. почитай, а лучше ПОПРОБУЙ это запустить и все поймешь.

а IP тебе будет нужен только тот НА КОТОРОМ сокет будет слушать, а куда отвечать и без тебя разберутся.
 

hermit_refined

Отшельник
1) нормально.
2) делать из клиента - сервер а из сервера - клиента? бр...

Судя по 'getenv("REMOTE_ADDR");' речь идёт о уже каком-то сервере (Апаче?), под которым выполняется этот скрипт. Чем не устраивает HTTP протокол?
 

Regen

Новичок
Автор оригинала: hermit_refined
Судя по 'getenv("REMOTE_ADDR");' речь идёт о уже каком-то сервере (Апаче?), под которым выполняется этот скрипт. Чем не устраивает HTTP протокол?
Да. Стоит Апач. ОС - Фрибисд.
К сожалению причина банальна: не умею я с ним работать. К сожалению. Если дадите пример на код + мануал , то буду благодарен.

На у насчёт ротации сервер-клиент... Это было рождено в моём мозгу тчобы обойти то что скрипт постоянно висит на серваке.
 

440hz

php.ru
Regen


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

а отдавать можно хоть HTML, хоть XMK, хоть plain/text
 

hermit_refined

Отшельник
Если по HTTP будете общаться - то висит только Апач, а скрипт лишь вызывается при каждом новом запросе. Описание протокола - http://www.faqs.org/rfcs/rfc2616.html (русский перевод более ранней версии - http://lib.ru/WEBMASTER/rfc2068/rfc2068rus.txt)

Клиентская программа в данном случае должна работать, будто она браузер, а скрипт - будто отдаёт данные браузеру (без HTML, разумеется).

Можно, конечно, и написать свой сервер (на php или С), но... смотрите сами - стоит ли игра свеч, тем более если вы подобного раньше не писали.
 

440hz

php.ru
hermit_refined

правильно.
легче в клиенте получить стандартный HTTP ответ чем писать свой сервер на PHP.
 
Сверху