c - 绑定(bind)到特定地址但随机端口 Linux

标签 c linux sockets

是否有一种惯用的方法来指定要绑定(bind)到的特定地址,但不是随机端口?

在我的应用程序中,我打开了几十个连接。我在 connect() 之前调用 bind() 以便我可以指定应该建立连接的 IP 地址。但是,我必须自己找到一个开放的端口。目前它工作正常,但如果我需要打开数千个连接,它可能会成为一个问题,因为找到一个打开的端口会变得越来越慢

int fd;
struct sockaddr_in addr;

fd = socket(AF_INET, SOCK_STREAM, 0);

while (TRUE)
{
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("192.168.0.1");
    addr.sin_port = htons((rand() % 65000) + 1);

    if (bind(fd, (struct sockaddr *)&addr, sizeof (struct sockaddr_in)) == 0)
        break;
}

我考虑过编写我自己的“端口管理”系统,但我想我会在继续之前尝试查看操作系统是否已经具有该功能

最佳答案

只需将 addr.sin_port 设置为零。操作系统会为您选择一个。

bind之后,你可以调用getsockname来找出你绑定(bind)到哪个端口。

关于c - 绑定(bind)到特定地址但随机端口 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31974157/

相关文章:

java - 如何解析通过 TCP 收到的损坏消息

c - Valgrind 发现内存泄漏,但我无法理解

试用软件的编码

linux - awk/gawk asorti() 问题

linux - awk one liner 根据一列的值只选择行

javascript - 如何防止 socket.io 顺序/自动发出事件?

c++ - 如何知道C++中 `shm_open`使用的共享内存的可用大小?

c - 只有某些输入的 C 中的段错误

linux - 如何在 linux 中使用文本文件中的值转到目录

java - Android Socket 就绪检测?