幕布斯7119047
正如ZanLnyx所说,它使用本地路由表来查找用于连接到特定外部主机的以太网接口的IP地址。通过使用连接的UDP套接字,您可以在不实际发送任何数据包的情况下获取信息。此方法要求您选择特定的外部主机。在大多数情况下,任何知名的公共IP都应该做到这一点。为此,我喜欢Google的公共DNS服务器地址8.8.8.8,但有时您可能希望选择不同的外部主机IP。下面是一些说明完整方法的代码。void GetPrimaryIp(char* buffer, size_t buflen) {
assert(buflen >= 16);
int sock = socket(AF_INET, SOCK_DGRAM, 0);
assert(sock != -1);
const char* kGoogleDnsIp = "8.8.8.8";
uint16_t kDnsPort = 53;
struct sockaddr_in serv;
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(kGoogleDnsIp);
serv.sin_port = htons(kDnsPort);
int err = connect(sock, (const sockaddr*) &serv, sizeof(serv));
assert(err != -1);
sockaddr_in name;
socklen_t namelen = sizeof(name);
err = getsockname(sock, (sockaddr*) &name, &namelen);
assert(err != -1);
const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, buflen);
assert(p);
close(sock);}