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