Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с сокетами


Автор: kreez 18.11.2002, 10:51
У меня в процессе разработки многозадачного сервера под 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 администраторов). Я уже сломал себе голову. Помогите, пожалуйста!

Автор: suborg 19.11.2002, 04:12
Я думаю, нужно сделать гораздо проще - повесить поток на сокет, который будет забирать всё приходящие пакеты, и разсортировывать по очередям, принадлежащим другим пяти потокам уже соответственно твоей задаче. Достаточно просто и эффективно.

Автор: Coocky 7.6.2007, 09:53
123

Автор: threef 7.6.2007, 20:32
Цитата

Код

addr.sin_addr.s_addr = INADDR_ANY;




А это тебе зачем ? Поменяй Аню на кого-нибудь, должо быть счастье

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)