打开 2 个相邻的 UDP 临时端口

Open 2 Adjacent UDP Ephemeral Ports

本文关键字:UDP 打开      更新时间:2023-10-16

怎么可能编写一个打开两个相邻端口的函数。例如,第一次可能需要端口 1234 和 1235,下一次调用可能需要 5678 和 5677,依此类推。

我遇到的问题是,如果我先使用一个临时端口,我无法保证是否使用相邻端口中的任何一个。因此,解决方案是在循环中获取一个临时端口,不断尝试使用相邻端口,直到找到一个端口。

采用随机端口与临时端口具有相同的问题。

如果我不断添加一个尝试使用端口的端口,我在哪里停止和开始,什么时候停止搜索?

有没有一种快速的方法来测试两个端口是否打开,最好不必先打开它们。我宁愿有一个独立于操作系统的解决方案,但是如果我必须为每个操作系统编写一个解决方案,那很好。

通常,当您打开套接字并连接到服务器或发送 UDP 数据报时,操作系统会打开下一个可用端口作为临时端口。但是,您不能信任这一点,这取决于许多因素,包括其他应用程序打开套接字、操作系统实现等。

如果要打开相邻的套接字,则需要在发送数据报之前绑定套接字。

代码将是这样的:

#include <sys/socket.h>
...
int main() {
    int ret;
    int fd[65536];
    struct sockaddr_in myaddr;
    uint16_t port = 10000;

    for(int i = 1; i < 65536; i++)
    {
        fd[i] = socket(AF_INET, SOCK_DGRAM, 0);
        if (fd[i] < 0) exit(1);
        // Local
        memset(&myaddr, 0, sizeof(struct sockaddr_in));
        myaddr.sin_family = AF_INET;
        myaddr.sin_port = htons(i);
        myaddr.sin_addr.s_addr = inet_addr(MY_IP_ADDRESS);
        ret = bind(fd[i], (struct sockaddr *)&myaddr, sizeof(struct sockaddr));
        ...
    }
    ...
    return 0;   
}