程序源码如下: 1. 形参ipv4, ipv6为外部调用者传入,用来保存ipv4地址和ipv6地址, 2. MAX_PATH为自定义宏, 为数值260, IPVN_SIZE为数值50, DEFAULT_STR_PORT为字符串"8080" - #include <winsock2.h>
- #include <ws2tcpip.h>
- #pragma comment(lib,"Ws2_32.lib")
-
-
- void CAllBox::getLocalIPv4( char * ip4)
- {
- // 获得本机主机名
- #ifdef _WIN32
- INT rc;
- WSADATA wsaData;
-
- rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
- if (rc) {
- return ;
- }
- #endif
-
- char hostname[MAX_PATH];
- memset(hostname, 0, MAX_PATH);
- gethostname(hostname, MAX_PATH);
- struct hostent FAR* lpHostEnt = gethostbyname(hostname);
- if (lpHostEnt == NULL)
- {
- return;
- }
-
- // 取得IP地址列表中的第一个为返回的IP, 即有线网卡IP(因为一台主机可能会绑定多个IP)
- LPSTR lpAddr = lpHostEnt->h_addr_list[0];
-
- // 将IP地址转化成字符串形式
- struct in_addr inAddr;
- memmove(&inAddr, lpAddr, 4);
-
- #ifdef _WIN32
- WSACleanup();
- #endif
-
- strncpy(ip4, inet_ntoa(inAddr), strlen(inet_ntoa(inAddr)));
-
- return;
- }
-
-
- void CAllBox::getLocalIPv6(char* ip6)
- {
- #ifdef _WIN32
- INT rc;
- WSADATA wsaData;
-
- rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
- if (rc) {
- return ;
- }
- #endif
-
- PHOSTENT hostinfo;
- char hostname[HOSTNAME_LEN]; //主机名
- char *port = DEFAULT_STR_PORT; //端口号
- int ilRc;
-
- memset(hostname, 0, HOSTNAME_LEN);
-
- gethostname(hostname, sizeof(hostname));
-
- struct addrinfo hint;
- struct addrinfo *ailist = NULL, *aip = NULL;
- struct sockaddr_in6 *sinp6;
-
- hint.ai_family = AF_INET6; /* hint 的限定设置 */
- hint.ai_socktype = SOCK_STREAM; /* 这里可是设置 socket type 比如 SOCK——DGRAM */
- hint.ai_flags = AI_PASSIVE; // flags 的标志很多 。常用的有AI_CANONNAME;
- hint.ai_protocol = DEFAULT_PROT; /* 设置协议 一般为0,默认 */
- hint.ai_addrlen = DEFAULT_ADDRLEN; /* 下面不可以设置,为0,或者为NULL */
- hint.ai_canonname = NULL;
- hint.ai_addr = NULL;
- hint.ai_next = NULL;
- ilRc = getaddrinfo(hostname, port, &hint, &ailist); /*通过主机名获得地址信息*/
- if (ilRc < 0)
- {
- char str_error[ERR_MSG_LEN];
- strcpy(str_error, (char *)gai_strerror(errno));
- return ;
- }
- if (ailist == NULL)
- {
- return ;
- }
-
- aip = ailist;
- aip->ai_family == AF_INET6;
- sinp6 = (struct sockaddr_in6 *)aip->ai_addr;
- inet_ntop(AF_INET6, (void*)&sinp6->sin6_addr, ip6, IPVN_SIZE);
-
- #ifdef _WIN32
- WSACleanup();
- #endif
-
- return ;
- }
复制代码
|