LINUX.ORG.RU

Помогите, plz! Проблема с сокетами....


0

0

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


Re: Помогите, plz! Проблема с сокетами....

Я бы вынес работу с сокетом целиком в отдельный поток, с которым бы уже в свою очередь работали бы остальные потоки. В том потоке предумотрел бы очередь для отправки сообщений и их приемаю

anonymous ()

Re: Помогите, plz! Проблема с сокетами....

Попробуй изменить дизайн:

Создай одну из нитей для чтения всех сообщений с сокета и определяющей с какого адреса пришло это сообщение. В зависимости от адреса отправителя забрасывает полученные данные через очереди (pipe, shared memory - выбирай сам) для обработки в соответствующую нить.

Так получается просто и логески понятно.

Удачи!

tvn ()

Re: Помогите, plz! Проблема с сокетами....

Ну вообщето recvfrom(int s, void *buf,size_t len, int flags, !!struct sockaddr *from!!, int *fromlen); Просто заполни структтуру from с указанием нужного тебе Айпишника и получай себе только нужные пакеты.

OxiD ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.