下面的方法可以获取所有IP 在此之前要调用 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); void GetIpsByGethost() { char buffer[256] = {0}; struct hostent *pIpList; if (gethostname(buffer, 256) == 0) { pIpList = gethostbyname(buffer); int i = 0; while (pIpList->h_addr_list[i] != NULL) { unsigned char *ip = (unsigned char *)pIpList->h_addr_list[i]; char fip[64] = {0}; sprintf(fip, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); printf("%s\n", fip); i++; } } } 使用Getaddrinfo的方法如下所示 void GetIpsByGetAddr() { char buffer[256] = {0}; if (gethostname(buffer, 256) == 0) { struct addrinfo hinsAddr; memset(&hinsAddr, 0, sizeof(hinsAddr)); hinsAddr.ai_family = AF_INET; hinsAddr.ai_socktype = SOCK_STREAM; hinsAddr.ai_protocol = IPPROTO_TCP; struct addrinfo *outAddr; int retVal = 0; retVal = getaddrinfo(buffer, NULL, &hinsAddr, &outAddr); if (retVal != 0) { printf("getaddrinfo failed/n"); return; } struct sockaddr_in *addrIn = (sockaddr_in *)outAddr->ai_addr; char *ip = inet_ntoa(addrIn->sin_addr); printf("%s/n", ip); struct addrinfo *nextAddr = outAddr->ai_next; while (nextAddr != NULL) { addrIn = (sockaddr_in *)nextAddr->ai_addr; char *ip = inet_ntoa(addrIn->sin_addr); printf("%s/n", ip); nextAddr = nextAddr->ai_next; } } } 注意sockaddr和sockaddr_in都是16字节,in_addr为四个字节 struct sockaddr { ushort sa_family; char sa_data[14]; }; struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };