我试图find我的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.0.0.0是INADDR_ANY ,表示套接字绑定到主机上的所有本地地址,而不仅仅是一个地址。 您正在询问一个地址,但是您没有绑定到一个地址,所以getsockname()不能报告特定的地址。
如果你想让getsockname()报告一个特定的地址,你必须bind()到那个特定的地址。 因此,使用GetAdaptersAddresses来枚举本地主机上的所有接口,并将一个单独的套接字bind()到每个地址,而不是在一个套接字上绑定INADDR_ANY 。
否则,可以bind()一个套接字bind()到INADDR_ANY ,然后使用WSARecvMsg() (而不是recv() , recvfrom()或WSARecvFrom() )读取传入数据包。 WSARecvMsg()可以报告有关每个数据包的到达接口和目标地址的详细信息,如果使用setsockopt()启用适当的选项。