|
发表于 2019-4-6 20:18:12
|
显示全部楼层
本帖最后由 xx_player 于 2019-4-7 21:15 编辑
仅了解inet_ntop是远远不够地,看这里吧,在里面能找到AF_INET 。这一句
inet_ntop(AF_INET,&sockaddr_ipv4->sin_addr, ip4str,64)<<endl;
将地址sockaddr_ipv4->sin_addr的4个字节数转成ip格式串。返回也是串,等于ip4str,64是缓冲区长度。
例程获取的是本机的网卡相关配置信息。注意:本机是你的机器名,不是运行结果中的DESKTOP-C4G58AO,
那是我这里的,不要搞错了。在我机器上运行是这样,在你那里运行就不是了。
#include "stdafx.h"
#include<iostream>
#include<iomanip>
#include<WS2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
BOOL SetConsoleColor(WORD wAttributes)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INVALID_HANDLE_VALUE)
return FALSE;
return SetConsoleTextAttribute(hConsole, wAttributes);
}
int main()
{
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
addrinfo hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
addrinfo*result;
CHAR ip4str[46];
TCHAR ipv6str[46];
DWORD ipv6strlength = 46;
struct sockaddr_in *sockaddr_ipv4;
LPSOCKADDR sockaddr_ip;
char hostname[64];
gethostname(hostname, 64);
ret = getaddrinfo(hostname, NULL, &hints, &result);
int count = 0;
SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout << "本机 ";
SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << hostname;
SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout<<" 网络信息:" << endl;
cout << "====================================================================" << endl;
for(addrinfo*ptr = result; ptr != NULL; ptr = ptr->ai_next) {
++count;
SetConsoleColor(FOREGROUND_RED| FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout << "第"<<count<<"条信息"<<endl;
SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
cout<<setw(16)<<"网络家族: ";
SetConsoleColor(FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
switch (ptr->ai_family) {
case AF_UNSPEC: cout << "Unspecified"<<endl;break;
case AF_INET: cout << "AF_INET (IPv4)";
sockaddr_ipv4 = (struct sockaddr_in *) ptr->ai_addr;
cout << "\tIPv4 地址 "<< inet_ntop(AF_INET,&sockaddr_ipv4->sin_addr, ip4str,64)<<endl;
break;
case AF_INET6: cout << "AF_INET6 (IPv6)";
sockaddr_ip = (LPSOCKADDR)ptr->ai_addr;
ipv6strlength = 46;
ret = WSAAddressToString(sockaddr_ip, (DWORD)ptr->ai_addrlen, NULL, ipv6str, &ipv6strlength);
if (ret) cout<<"WSAAddressToString 失败!错误码= "<<WSAGetLastError()<<endl;
else wcout << "\tIPv6 地址 "<< ipv6str << endl;
break;
case AF_NETBIOS: cout << "AF_NETBIOS (NetBIOS)" << endl; break;
default: cout << "Other "<<ptr->ai_family << endl;break;
}
SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN );
cout << setw(16) << "套接字类型: ";
SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_BLUE|FOREGROUND_INTENSITY);
switch (ptr->ai_socktype) {
case 0: cout << "Unspecified" << endl;; break;
case SOCK_STREAM: cout << "SOCK_STREAM (stream)" << endl; break;
case SOCK_DGRAM: cout << "SOCK_DGRAM (datagram)" << endl;break;
case SOCK_RAW: cout << "SOCK_RAW (raw) " << endl;break;
case SOCK_RDM: cout << "SOCK_RDM (reliable message datagram)" << endl; break;
case SOCK_SEQPACKET:cout << "SOCK_SEQPACKET (pseudo-stream packet)" << endl;break;
default: cout <<"Other " << ptr->ai_socktype << endl;break;
}
SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN );
cout << setw(16) << "网络协议: ";
SetConsoleColor(FOREGROUND_GREEN );
switch (ptr->ai_protocol) {
case 0: cout << "Unspecified" << endl;break;
case IPPROTO_TCP: cout << "IPPROTO_TCP (TCP)" << endl;break;
case IPPROTO_UDP: cout << "IPPROTO_UDP (UDP)" << endl;break;
default: cout << "Other " << ptr->ai_protocol << endl;break;
}
}
SetConsoleColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout << "====================================================================" << endl;
freeaddrinfo(result);
WSACleanup();
SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
system("pause");
return 0;
}
运行结果:
|
|