Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очередность использования сокета, как сделать? 
:(
    Опции темы
Sniper
Дата 18.12.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Вопрос такой.

Как организовать работу многих пользователей через один сокет и соответственно посылку/приемку данных? Интересует какой-нибудь план, как это реализовать.

Да, база понятна : socket_create(), socket_bind() socket_listen() socket_read/write тоже, а как дальше?

Это сообщение отредактировал(а) Sniper - 18.12.2009, 17:05


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Pfailed
Дата 20.12.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 1
Всего: 39



Мультиплексирование.
С помощью socket_select() в цикле следим за тем когда один из сокетов будет готов для чтения/записи. Подключающихся клиентов добавляем в массив сокетов за которыми ведётся наблюдение.


--------------------
PM MAIL   Вверх
Sniper
Дата 21.12.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



эээм, у меня один сокет... так было сделано... как быть?


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Pfailed
Дата 21.12.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 1
Всего: 39



При подключении клиента так или иначе образуеися второй сокет (socket_accept). Не так ли?


--------------------
PM MAIL   Вверх
Sniper
Дата 21.12.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



>При подключении клиента так или иначе образуеися второй сокет (socket_accept). Не так ли?

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


Код

т.е. webbrowser <-> php скрипт < --- socket ---> Си программа


Вот как раз Си программа выполняется только для одного подключения за раз, т.е приняла данные от php скрипта, выполнила, отправила назад - можно принимать другие данные.

Это сообщение отредактировал(а) Sniper - 21.12.2009, 22:34


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Pfailed
Дата 22.12.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 1
Всего: 39



Это си программа принимает соединения? Она слушает порт или как?


--------------------
PM MAIL   Вверх
Simpliest
Дата 22.12.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Бгг.
Короче ТС запутал все.

Значит так.  Если C-программа слушает у тебя конкретный порт, то после открытия его по сессии одного пользователя, открыть для второго пользователя ты не сможешь, пока не завершиться сессия первого.
Поэтому тебе достаточно проверять открылся ли порт и все.
И естественно по окончании работы не забывать закрывать.


--------------------
user posted image
PM   Вверх
Sniper
Дата 23.12.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Цитата(Pfailed @ 22.12.2009,  12:46)
Это си программа принимает соединения? Она слушает порт или как?

Да, именно так.

Добавлено @ 10:27
Цитата(Simpliest @ 22.12.2009,  14:38)
Бгг.
Короче ТС запутал все.

Значит так.  Если C-программа слушает у тебя конкретный порт, то после открытия его по сессии одного пользователя, открыть для второго пользователя ты не сможешь, пока не завершиться сессия первого.
Поэтому тебе достаточно проверять открылся ли порт и все.
И естественно по окончании работы не забывать закрывать.

В том то и поблема, что происходит коллизия.

Программа на СИ исполняет разные команды(функции программы) и для кадого пользователя в данный момент времени она исполняет только одну.

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

Нужно создать какойто массив портов? Но пользователей же неограниченно должно быть. А как получать ответ и пересылать его конкретному клиенту(браузеру)?

Это сообщение отредактировал(а) Sniper - 23.12.2009, 10:28


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Pfailed
Дата 23.12.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 1
Всего: 39



Если у вас сервер - программа на си, то и править нужно эту программу. Каким боком тут php неясно.



--------------------
PM MAIL   Вверх
Simpliest
Дата 23.12.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Цитата(Sniper @  23.12.2009,  09:20 Найти цитируемый пост)
 пользователь мог(если нужная функция не выполняется)

не прикольно ни разу.

Могу посоветовать написать прокси, вкупе с очередью на чем угодно.
С web стороны это будет выглядеть как ajax опрос.
Нажал кнопочку - запрос ушел, у тебя где-нибудь показываеться ожидайте и ждешь своей очереди.
Запрос пришел скрипту ты открыл сокет на прокси отдал данные.
периодически от клиента опрашивается состояние. Т.е. запускается скрипт, открывает сокет на прокси и спрашивает - "ну что готово?"
если готово забираем ответ и отдаем.


Цитата(Sniper @  23.12.2009,  09:20 Найти цитируемый пост)
А как получать ответ и пересылать его конкретному клиенту(браузеру)?

аякс, куки, сессия. Ответ мы не пересылаем, пользователь сам за ним обращается через время. Кому и что отсылать можно определять по sessid.
Можно конечно самим отправлять ответ пользователю без повторных внешних конектов, для этого надо делать долгоживущие соединения - но апач этого не выдержит в большом количестве.

Поэтому
Цитата(Sniper @  23.12.2009,  09:20 Найти цитируемый пост)
Нужно создать какойто массив портов? Но пользователей же неограниченно должно быть.

Посмотри на DkLab мультиплексор котеровский.


--------------------
user posted image
PM   Вверх
Sniper
Дата 28.12.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Цитата(Simpliest @ 23.12.2009,  12:38)
Могу посоветовать написать прокси, вкупе с очередью на чем угодно.

ээм, "нам бы схемку, аль чертеж мы затеяли вертеж.."


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Simpliest
Дата 28.12.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



браузер <-> ajax-запрос <-> скрипт <-> файлы запросов/результатов или БД <-> прокси скрипт <-> сокет <-> C-программа

Постановка задачи в очередь:
ourscript.php?action=newJob&param1=value1&param2=value - даем задание. Скрипт создает файл/запись с данными с новым уникальным jobID и возвращает клиенту jobID, который будет дальше использоваться для периодических опросов готов/неготов.

Ajax'ом по таймауту периодически опрашиваем:
ourscript.php?jobId=1111&action=ask - спрашиваем есть ли результат. Скрипт смотрит, есть ли файл/запись с таким jobID. Если есть читаем и отдаем его, после чего удаляем/архивируем. Если нет - отвечаем "ждать".

На сервере как демон или по крону работает proxy.php
Его задача периодически опрашивать C-программу и если она свободна, взять самое старое из заданий(в БД или файлах - неважно) и отдать его программе.
Потом забрать у нее результат, положить в файл-результат, а файл-задание удалить/архивировать.



--------------------
user posted image
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.