Различение сокетов с помощью Select - PullRequest
1 голос
/ 03 апреля 2011

Я делаю TCP / IP-сервер, который прослушивает несколько портов.Я решил использовать select для включения обработки нескольких событий.

Итак, на данный момент у меня есть два сокета, которые подключены к двум разным портам (3000, 3001).

Once I 'м внутри цикла выбора, я хочу, чтобы сервер реагировал по-разному в зависимости от порта, который он обрабатывает в настоящее время.Как я могу сказать, в каком сокете я нахожусь, один раз внутри выбора?


Я добавляю код для моего цикла выбора, надеюсь, вы, ребята, сможете указать мне правильное направление.Обратите внимание, что это начинается после того, как я добавил оба дескриптора файла в набор.

while(1)

{

    /* Block until input arrives on one or more active sockets. */

    readfds = activefds;

    if (select (FD_SETSIZE, &readfds, NULL, NULL, NULL) < 0)

    {

        perror ("select");

        exit (EXIT_FAILURE);

    }



    /* Service all the sockets with input pending. */

    for (i = 0; i < FD_SETSIZE; ++i)

    {

        if (FD_ISSET (i, &readfds))

        {

            if (i == S_time)

            {


                if ((NS = accept(S_time,NULL,NULL)) < 0)

                    ERROR("server: accept");

                FD_SET(NS, &activefds); //add the new socket desc to our active connections set

                send_time(NS);



            }

            else if (i == S_remote)// i == S_remote

            {

                fprintf(stderr,"Remote");

                int status = recieve_request(S_remote);

                /* Data arriving on an already-connected socket. */



            }

            else

            {

                break;

            }

        }

    } /* //end of for */

} /* //end of while */

Итак, мои два сокета - S_time и S_remote.Когда клиент подключается к временному сокету, я хочу отправить этому клиенту текущее время.Когда клиент подключается к удаленному, я хотел сделать удаленное выполнение.Как я могу сделать это различие?

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

select() имеет дело с файловыми дескрипторами, он ничего не знает о номере порта.

Вам нужно будет самостоятельно отслеживать эту информацию (например, через карту, указанную дескриптором файла).) или просто используйте несколько наборов файловых дескрипторов (где каждый набор специфичен для порта) и вызовите select с нулевым тайм-аутом (неблокирующим) для каждого набора.

0 голосов
/ 03 апреля 2011

Проверьте это объяснение и пример кода , кажется, что оно отвечает на ваш вопрос. Вкратце, после возврата из select () соответствующий дескриптор включается в соответствующий набор. Для получения подробной информации перейдите по ссылке.

...