如何将 UDP 套接字绑定到一定范围的端口

发布于 2024-11-18 06:24:37 字数 112 浏览 1 评论 0原文

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

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

I want to write a kernel thread for an application that will read all UDP packets. I am facing problem in binding as these packet can arrive in range of ports (say 5001 to 5005).

How to do this.
Any pointer/link will be helpful.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我很OK 2024-11-25 06:24:37

您不能将一个套接字绑定到多个端口,请按照注释中建议的 0verbose 操作并每个端口使用一个套接字

You can't bind a socket to more than one port, do as 0verbose suggested in a comment and use one socket per port

诗笺 2024-11-25 06:24:37

除了打开多个套接字之外,您还需要使用 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 */ 

    }

}

希望此代码对您有所帮助

Besides opening multiple sockets, you need to use select()/poll() to listen to all sockets at once.
If you are programming in C/C++ under Linux, here is a pseudo-code in 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 */ 

    }

}

Hope this code will help you

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文