![]() |
|
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]()
|
|
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
Вопрос такой.
Как организовать работу многих пользователей через один сокет и соответственно посылку/приемку данных? Интересует какой-нибудь план, как это реализовать. Да, база понятна : socket_create(), socket_bind() socket_listen() socket_read/write тоже, а как дальше? Это сообщение отредактировал(а) Sniper - 18.12.2009, 17:05 -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
Мультиплексирование.
С помощью socket_select() в цикле следим за тем когда один из сокетов будет готов для чтения/записи. Подключающихся клиентов добавляем в массив сокетов за которыми ведётся наблюдение. |
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
эээм, у меня один сокет... так было сделано... как быть?
-------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
При подключении клиента так или иначе образуеися второй сокет (socket_accept). Не так ли?
|
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
>При подключении клиента так или иначе образуеися второй сокет (socket_accept). Не так ли?
да, только мне нельзя делать listen... потому как подключаться может только 1 клиент, потому что программа, которой передаются данные от клиента (через сокет), может выполнять только одно подключение, поэтому всех "желающих" надо поставить в очередь (это как одна дорога в оба направления).
Вот как раз Си программа выполняется только для одного подключения за раз, т.е приняла данные от php скрипта, выполнила, отправила назад - можно принимать другие данные. Это сообщение отредактировал(а) Sniper - 21.12.2009, 22:34 -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
Это си программа принимает соединения? Она слушает порт или как?
|
|||
|
||||
| Simpliest |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: нет Всего: 3 |
Бгг.
Короче ТС запутал все. Значит так. Если C-программа слушает у тебя конкретный порт, то после открытия его по сессии одного пользователя, открыть для второго пользователя ты не сможешь, пока не завершиться сессия первого. Поэтому тебе достаточно проверять открылся ли порт и все. И естественно по окончании работы не забывать закрывать. |
|||
|
||||
| Sniper |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
Да, именно так. Добавлено @ 10:27
В том то и поблема, что происходит коллизия. Программа на СИ исполняет разные команды(функции программы) и для кадого пользователя в данный момент времени она исполняет только одну. Мне нужно чтобы каждый подключившийся пользователь мог(если нужная функция не выполняется) исполнять разные команды(функции программы) в этой программе (для него это выглядит как нажатие кнопки в браузере). Нужно создать какойто массив портов? Но пользователей же неограниченно должно быть. А как получать ответ и пересылать его конкретному клиенту(браузеру)? Это сообщение отредактировал(а) Sniper - 23.12.2009, 10:28 -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
||||
|
|||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 1 Всего: 39 |
Если у вас сервер - программа на си, то и править нужно эту программу. Каким боком тут php неясно.
|
|||
|
||||
| Simpliest |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: нет Всего: 3 |
не прикольно ни разу. Могу посоветовать написать прокси, вкупе с очередью на чем угодно. С web стороны это будет выглядеть как ajax опрос. Нажал кнопочку - запрос ушел, у тебя где-нибудь показываеться ожидайте и ждешь своей очереди. Запрос пришел скрипту ты открыл сокет на прокси отдал данные. периодически от клиента опрашивается состояние. Т.е. запускается скрипт, открывает сокет на прокси и спрашивает - "ну что готово?" если готово забираем ответ и отдаем.
аякс, куки, сессия. Ответ мы не пересылаем, пользователь сам за ним обращается через время. Кому и что отсылать можно определять по sessid. Можно конечно самим отправлять ответ пользователю без повторных внешних конектов, для этого надо делать долгоживущие соединения - но апач этого не выдержит в большом количестве. Поэтому
Посмотри на DkLab мультиплексор котеровский. |
||||
|
|||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
ээм, "нам бы схемку, аль чертеж мы затеяли вертеж.." -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| Simpliest |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: нет Всего: 3 |
браузер <-> ajax-запрос <-> скрипт <-> файлы запросов/результатов или БД <-> прокси скрипт <-> сокет <-> C-программа
Постановка задачи в очередь: ourscript.php?action=newJob¶m1=value1¶m2=value - даем задание. Скрипт создает файл/запись с данными с новым уникальным jobID и возвращает клиенту jobID, который будет дальше использоваться для периодических опросов готов/неготов. Ajax'ом по таймауту периодически опрашиваем: ourscript.php?jobId=1111&action=ask - спрашиваем есть ли результат. Скрипт смотрит, есть ли файл/запись с таким jobID. Если есть читаем и отдаем его, после чего удаляем/архивируем. Если нет - отвечаем "ждать". На сервере как демон или по крону работает proxy.php Его задача периодически опрашивать C-программу и если она свободна, взять самое старое из заданий(в БД или файлах - неважно) и отдать его программе. Потом забрать у нее результат, положить в файл-результат, а файл-задание удалить/архивировать. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Сеть | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |