互联网协议地址(Internet Protocol Address,又译为网际协议地址),缩写为IP地址(IP Address)。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异
可以通过cmd下的IPconfig命名获取计算机中的IP地址
打开cmd
输入ipconfig命令
在编程中可以通过使用Winsock库实现获取IP地址
需要看几个函数:
WSAStartup函数
函数名:WSAStartup
函数原型::int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);
函数功能:初始化Winsock库
参数: wVersionRequested:接收一个WORD型整数,低位表示主版本号,高位表示子版本号
lpWSAData:WSADATA结构指针,保存函数获得的Winsock信息
sockaddr_in结构体用于保存客户的地址
struct sockaddr_in
{
short sin_family //地址族,Winsock中必须是AF_INET
unsigned short sin_port //网络字节序的端口号
struct in_addr //网络字节序的IP地址
char sin_zero[8] //没有用,只是为了增加8个字节长度
}
使用此结构体和sockaddr结构体长度一致
scokaddr_in用来存储主机的地址信息,但是主机的IP和端口必须为网络字节序。通常人们所说的IP“192.168.0.10”,
端口80等都是主机字节序
网络字节序和主机字节序之间的转换
短整型转换notohs转换为htons
u_short notohs ( //将网络字节序u_short转换为主机字节序
u_short netshort //要转换的u_short
);
u_short htons ( //将主机字节序u_short转换成网络字节序
u_short host short //要转换的u_short
);
IP地址转换 Inet_addr 与 inet_ntoa
unsingned long inet_addr( //将字符串(例如"192.168.0.10")转换为u_long类型
const char FAR *cp
);
char FAR * inet_ntoa ( //精sockaddr_in结构体中的sin_addr转换为字符串
struct in_addr in
);
程序代码
- #include <stdio.h>
- #include <winsock2.h>
- //连接Winsock库
- #pragma comment(lib, "ws2_32.lib")
- void main()
- {
- //调用WSAtartup初始化Winsock库
- WSADATA wsaData;
- ::WSAStartup(
- MAKEWORD(2,2),//版本号为2.2
- &wsaData
- );
- char szHost[256];//存放主机名的缓冲区
- ::gethostname(szHost, 256);//取得本地主机名称
- hostent *pHost = ::gethostbyname(szHost);//通过主机名得到地址信息
- //一个主机可能有多个网卡、多个IP、下面的代码输出所有的IP地址
- in_addr addr;
- for(int i=0; ; i++)
- {
- //获得地址(网络字节)
- char *p = pHost->h_addr_list[i];
- if(NULL == p)
- {
- break;//退出循环
- }
- //将地址拷贝到in_addr结构体中
- memcpy(&addr.S_un.S_addr, p, pHost->h_length);
- //将in_addr转换为主机字节序
- char *strIP = ::inet_ntoa(addr);
- //打印IP地址
- printf("本机IP[%d]: %s\n", i+1, strIP);
- }
- //打印主机名
- printf("主机名:%s\n", szHost);
- system("pause");
- }
执行结果