Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с сокетами 
:(
    Опции темы
kreez
Дата 18.11.2002, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня в процессе разработки многозадачного сервера под Linux возникли проблемы... Может быть, вы сможете мне помочь...
В общем, есть UDP сокет (или RAW - неважно, главное, что без установки соединения, то есть не TCP), который используется, допустим, 5-ю потоками одновременно. Все пять потоков  запускаются во время запуска самого сервера и выполняются постоянно (пока сам сервер жив :)). Главный (родительский) поток должен принимать UDP сообщения от всех IP адресов, а каждому из пяти потоков "пришивается" прием сообщений только от конкретных IP (чтобы картина была ясна, представим, что есть пять админов, следящих за состоянием сервера удаленно, и для каждого админа есть свой собственный поток, который принимает от админа управляющие команды (данные включенные в UDP пакет)).

Пример:

В главном (родительском) потоке должно быть:

#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 администраторов). Я уже сломал себе голову. Помогите, пожалуйста!
PM MAIL   Вверх
suborg
Дата 19.11.2002, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

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



Я думаю, нужно сделать гораздо проще - повесить поток на сокет, который будет забирать всё приходящие пакеты, и разсортировывать по очередям, принадлежащим другим пяти потокам уже соответственно твоей задаче. Достаточно просто и эффективно.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 7.6.2007, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



123

Это сообщение отредактировал(а) Coocky - 8.6.2007, 09:23


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
threef
Дата 7.6.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Цитата

Код

addr.sin_addr.s_addr = INADDR_ANY;




А это тебе зачем ? Поменяй Аню на кого-нибудь, должо быть счастье
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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