c - 如何找到本地/临时端口号?

标签 c sockets udp winsock berkeley-sockets

我有一个使用 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/

相关文章:

android - 使用 NDK 捕获标准输出/标准错误

c - LibXML2 中有 "binary dump"或 "get binary representation"函数吗?

python - 如何从 Python 中的 TCP 套接字读取完整的 IP 帧?

Java客户端/服务器Socket程序-服务器不响应客户端请求

objective-c - UDP 不同网络上的两台计算机如何相互连接?

c - 不同端口上的 UDP sendto 和 receivefrom

objective-c - 检查对象是否为类类型

java - 如何检测丢失的 MySQL 服务器但仍允许长时间运行的查询

ios - UDP是否适合从iOS传输离散事件

c - "Logical or"和 "logical and"c 中的 if 语句输出不同,尽管看起来相同