我如何从UDP套接字(Windows c++)获得IP信息

How can I get IP information from a UDP socket (Windows C++)?

本文关键字:c++ 获得 IP 信息 Windows UDP 套接字      更新时间:2023-10-16

我试图找到我的UDP套接字绑定的IP地址(假设我不想使用另一种方法来找到计算机的IP地址)。如何做到这一点?下面的代码适用于端口号,但对于地址总是返回0.0.0.0:

struct sockaddr_in sin;
int addrlen = sizeof(sin);
if(getsockname(clientSock, (struct sockaddr *)&sin, &addrlen) == 0 &&
    sin.sin_family == AF_INET &&
    addrlen == sizeof(sin)){
    printf("RETURNING ADDR: %s: len = %dn", inet_ntoa(sin.sin_addr),
        strlen(inet_ntoa(sin.sin_addr)));
}

使用以下代码绑定套接字:

sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1");
local.sin_port = 0; //assign given port
result = bind(clientSock, (sockaddr*)&local, sizeof(local));

谢谢你所有的帮助。感谢您的宝贵时间!

0.0.0.0INADDR_ANY,这意味着套接字绑定到主机上的所有本地地址,而不仅仅是一个地址。您正在请求一个地址,但您没有绑定到一个地址,因此getsockname()无法报告特定的地址。

如果您希望getsockname()报告一个特定的地址,您必须将bind()发送到该特定的地址。因此,使用GetAdaptersAddresses枚举本地主机上的所有接口,并使用bind()为每个地址提供单独的套接字,而不是将INADDR_ANY绑定到单个套接字上。

否则,您可以将单个套接字bind()设置为INADDR_ANY,然后使用WSARecvMsg()(而不是recv(), recvfrom()WSARecvFrom())读取传入的数据包。如果您在setsockopt()中启用适当的选项,WSARecvMsg()可以报告有关每个数据包的到达接口和目的地址的详细信息。