如何将UDP套接字绑定到一系列端口

时间:2011-07-04 10:51:52

标签: sockets udp kernel

我想为将读取所有UDP数据包的应用程序编写内核线程。我在绑定方面遇到问题,因为这些数据包可以到达端口范围(比如5001到5005)。

如何做到这一点。 任何指针/链接都会有所帮助。

2 个答案:

答案 0 :(得分:2)

您无法将套接字绑定到多个端口,请在注释中建议使用0verbose并为每个端口使用一个套接字

答案 1 :(得分:2)

除了打开多个套接字外,还需要使用select()/ poll()一次监听所有套接字。 如果您是在Linux下使用C / C ++进行编程,那么这里是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 */ 

    }

}

希望此代码可以帮助您