我有一个使用 Berkley 套接字和 Winsock(取决于平台)的 UDP 客户端程序。
基本上它使用 getaddrinfo()
,然后是 socket()
,然后是 sendto()
。 sendto()
获取 getaddrinfo()
返回的地址信息。我的代码如下所示:
struct addrinfo hint;
memset(&hint, 0, sizeof(hint));
hint.ai_socktype = SOCK_DGRAM;
struct addrinfo *address;
getaddrinfo("127.0.0.1", "9999", &hint, &address);
SOCKET s = socket(address->ai_family, address->ai_socktype, address->ai_protocol);
sendto(s, "test", 4, 0, address->ai_addr, address->ai_addrlen);
我的问题是,什么时候设置本地/临时端口号?它是通过调用 sendto()
设置的吗?如果我将更多数据发送到不同的服务器,sendto()
是否会重用相同的临时端口号?如何获得临时端口号(以独立于协议(protocol)的方式)?我知道知道这一点可能没有用,而且 NAT 无论如何都可以改变它,但我只是想了解它是如何更好地工作的。
我也知道我可以使用 bind()
来设置本地端口,但我的问题是当操作系统为我选择本地端口时会发生什么。
最佳答案
你想要getsockname
函数:
struct sockaddr_storage ss;
socklen_t len;
len = sizeof(ss);
if (getsockname(s, (struct sockaddr *)&ss, &len) == 0) {
// print contents of ss
}
它使用套接字绑定(bind)到的地址和端口填充给定的 sockaddr
。
此函数在 winsock 和 Berkely 套接字中均可用。
关于c - 如何找到本地/临时端口号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53216146/