gpt4 book ai didi

sockets - 为什么绑定(bind)返回相同的临时端口?

转载 作者:行者123 更新时间:2023-12-02 16:59:51 25 4
gpt4 key购买 nike

我有一个问题,我创建了两个 UDP 套接字,将它们绑定(bind)到端口 0 的环回地址(请求堆栈分配一个临时端口)。我的理解是两个套接字应该位于不同的端口上。在下面的代码示例中,两个套接字都位于相同的 IP 地址和端口上。

#include <stdio.h>
#include <arpa/inet.h>

int main(int, char**)
{
int fd1 = ::socket(AF_INET, SOCK_DGRAM, 0);
if (fd1 < 0)
{
perror("fd1 socket()");
return -1;
}
int fd2 = ::socket(AF_INET, SOCK_DGRAM, 0);
if (fd2 < 0)
{
perror("fd2 socket()");
return -1;
}

// Set SO_REUSEADDR for both sockets
int reuse = 1;
if (::setsockopt(fd1, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
perror("fd1 SO_REUSEADDR failed");
return -1;
}
if (::setsockopt(fd2, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
perror("fd2 SO_REUSEADDR failed");
return -1;
}

sockaddr_storage storage;
socklen_t addrlen = sizeof(storage);
sockaddr_in& addr = reinterpret_cast<sockaddr_in&>(storage);
addr.sin_family = AF_INET;
addr.sin_port = 1234;
addr.sin_port = 0;
if (::inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr) <= 0)
{
perror("Failed to create address 127.0.0.1");
return -1;
}
sockaddr* pAddr = reinterpret_cast<sockaddr*>(&storage);

if (::bind(fd1, pAddr, addrlen) < 0)
{
perror("bind fd1 failed");
return -1;
}

// Get the local address for fd1
addrlen = sizeof(storage);
if (::getsockname(fd1, pAddr, &addrlen))
{
perror("getsockname for fd1 failed");
return -1;
}
char straddr[INET_ADDRSTRLEN];
if (!inet_ntop(AF_INET, &addr.sin_addr, straddr, sizeof(straddr)))
{
perror("inet_ntop for fd1 failed");
return -1;
}
printf("fd1=%d addr=%s:%d\n", fd1, straddr, addr.sin_port);

if (::bind(fd2, pAddr, addrlen) < 0)
{
perror("bind fd2 failed");
return -1;
}

// Get the local address for fd2
addrlen = sizeof(storage);
if (::getsockname(fd2, pAddr, &addrlen))
{
perror("getsockname for fd2 failed");
return -1;
}
if (!inet_ntop(AF_INET, &addr.sin_addr, straddr, sizeof(straddr)))
{
perror("inet_ntop for fd2 failed");
return -1;
}
printf("fd2=%d addr=%s:%d\n", fd2, straddr, addr.sin_port);

return 0;
}

此代码给出以下输出...

fd1=4 addr=127.0.0.1:1933
fd2=5 addr=127.0.0.1:1933

我需要两个套接字位于同一(本地)IP 地址,但端口不同。谁能解释为什么两个套接字共享相同的端口?有人可以建议修复吗?

最佳答案

这是 UDP 套接字上 SO_REUSEADDR 的预期行为。删除该设置以返回正常分配规则。

关于sockets - 为什么绑定(bind)返回相同的临时端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9375935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com