我试图找到我的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));
感谢您的帮助。我很感激你的时间!
答案 0 :(得分:2)
0.0.0.0
是INADDR_ANY
,这意味着套接字绑定到主机上的所有本地地址,而不仅仅是一个地址。您要求提供一个地址,但未绑定到一个地址,因此getsockname()
无法报告具体地址。
如果您希望getsockname()
报告特定地址,则必须bind()
到该特定地址。因此,使用GetAdaptersAddresses
枚举本地主机上的所有接口,bind()
枚举每个地址的单独套接字,而不是在单个套接字上绑定INADDR_ANY
。
否则,您可以bind()
单个套接字INADDR_ANY
,然后使用WSARecvMsg()
(而不是recv()
,recvfrom()
或{{1} })读取传入的数据包。如果您使用setsockopt()
启用了相应的选项,则WSARecvFrom()
可以报告有关每个数据包的到达界面和目标地址的详细信息。