如何从UDP套接字(Windows C ++)获取IP信息?

时间:2011-07-12 19:38:42

标签: c++ windows sockets udp ip

我试图找到我的UDP套接字绑定的IP地址(假设我不想使用其他方法来查找计算机的IP地址)。如何才能做到这一点?以下代码适用于PORT编号,但始终为地址返回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 = %d\n", 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));

感谢您的帮助。我很感激你的时间!

1 个答案:

答案 0 :(得分:2)

0.0.0.0INADDR_ANY,这意味着套接字绑定到主机上的所有本地地址,而不仅仅是一个地址。您要求提供一个地址,但未绑定到一个地址,因此getsockname()无法报告具体地址。

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

否则,您可以bind()单个套接字INADDR_ANY,然后使用WSARecvMsg()(而不是recv()recvfrom()或{{1} })读取传入的数据包。如果您使用setsockopt()启用了相应的选项,则WSARecvFrom()可以报告有关每个数据包的到达界面和目标地址的详细信息。