как привязать сокет UDP к диапазону портов - PullRequest
1 голос
/ 04 июля 2011

Я хочу написать поток ядра для приложения, которое будет читать все пакеты UDP. Я сталкиваюсь с проблемой связывания, поскольку эти пакеты могут поступать в диапазоне портов (скажем, от 5001 до 5005).

Как это сделать. Любой указатель / ссылка будет полезен.

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Помимо открытия нескольких сокетов, вы должны использовать select () / poll () для прослушивания всех сокетов одновременно. Если вы программируете на C / C ++ под Linux, вот псевдокод на C:

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

...

int main()
{
    fd_set afds;
    fd_set rfds;
    int maxfd = -1;
    int fd, ret;

    /* initialize fdsets */
    FD_ZERO(&afds);

    /* create a socket per port */
    foreach (port p) {
        fd = create_udp_socket(p);  /* also bind to port p */
        if (fd < 0) error_exit("error: socket()\n");
        FD_SET(fd, &afds);
        if (fd > maxfd) maxfd = fd;
    }

    while (1) {
        memcpy(&rfds, &afds, sizeof(rfds));

        /* wait for a packet from any port */
        ret = select(maxfd + 1, &rfds, NULL, NULL, NULL);
        if (ret < 0) error_exit("error: select()\n");

        /* which socket that i received the packet */
        for (fd=0; fd<=maxfd; ++fd) 
            if (FD_ISSET(fd, &rfds)) 
                process_packet(fd); /* read the packet from socket fd */ 

    }

}

Надеюсь, этот код поможет вам

2 голосов
/ 04 июля 2011

Вы не можете привязать сокет к более чем одному порту, сделайте, как указано в комментарии 0verbose, и используйте один сокет на порт

...