打开2个相邻的UDP短暂端口

时间:2016-02-26 00:00:58

标签: c++ network-programming

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

我遇到的问题是,如果我首先使用短暂的端口,我不能保证相邻的任何一个端口都被占用。所以解决方案是在一个循环中采用一个短暂的端口,不断尝试取一个相邻的端口,直到找到一个。

使用随机端口与短暂端口具有相同的问题。

如果我不断添加一个尝试接收端口,我在哪里停止并开始,何时停止搜索?

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

1 个答案:

答案 0 :(得分:0)

通常,当您打开套接字并连接到服务器或发送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;   
}