![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| kreez |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 16.11.2002 Репутация: нет Всего: нет |
У меня в процессе разработки многозадачного сервера под Linux возникли проблемы... Может быть, вы сможете мне помочь...
В общем, есть UDP сокет (или RAW - неважно, главное, что без установки соединения, то есть не TCP), который используется, допустим, 5-ю потоками одновременно. Все пять потоков запускаются во время запуска самого сервера и выполняются постоянно (пока сам сервер жив Пример: В главном (родительском) потоке должно быть: #include ....... .................... .................... .................... int main() { char buffer[1024]; struct sockaddr_in addr; int sd, addr_size, bytes_amount; sd = socket (PF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons (9999); addr.sin_addr.s_addr = INADDR_ANY; bind (sd, &addr, sizeof(addr)); // ЗДЕСЬ ДОЛЖНЫ СОЗДАВАТЬСЯ 5 ДОЧЕРНИХ ПОТОКОВ ДЛЯ ОБСЛУЖИВАНИЯ // ЗАПРОСОВ АДМИНИСТРАТОРОВ bzero (buffer, 1024); addr_size = 1024; bytes_amount = recvfrom (sd, buffer, 1024, 0, &addr, &addr_size); // ЗДЕСЬ ИДЕТ КОД ОБРАБОТКИ ПОСТУПИВШИХ ДАННЫХ ОТ ПОЛЬЗОВАТЕЛЕЙ СЕРВЕРА (ОБЫЧНЫХ ПОЛЬЗОВАТЕЛЕЙ) } В дочерней потоковой функции должен быть код, принимающий через сокет sd из главного потока пакеты только от фиксированного IP ((один IP - один админ - один поток) -- всего их пять). Как сделать так, чтобы recvfrom() в дочернем потоке принимала пакеты только от конкретного IP (жестко фиксированного), а не от всех? Вместе с тем, все пакеты должны быть обработаны, их нельзя просто игнорировать... Схема такая - пакет поступает на IP сервера, где в зависимости от IP отправителя он обрабатывается либо главным потоком (собственно сервером), либо одним из дочерних потоков (если IP отправителя совпадает с одним из прописанных IP администраторов). Я уже сломал себе голову. Помогите, пожалуйста! |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Я думаю, нужно сделать гораздо проще - повесить поток на сокет, который будет забирать всё приходящие пакеты, и разсортировывать по очередям, принадлежащим другим пяти потокам уже соответственно твоей задаче. Достаточно просто и эффективно.
|
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
123
Это сообщение отредактировал(а) Coocky - 8.6.2007, 09:23 -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| threef |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
А это тебе зачем ? Поменяй Аню на кого-нибудь, должо быть счастье |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |