文章目录
- IP地址的表示方式以及在Socket通信中的使用
- 1. IP地址的表示方式
- 1.1 点分十进制
- 1.2 主机字节序
- 1.3 网络字节序
- 2. IP地址字节序转换
IP地址的表示方式以及在Socket通信中的使用
1. IP地址的表示方式
/*
使用 TCP/IP协议进行网络应用开发时, 必不可少需要对 IP地址进行必要的处理(IP是主机在网络通信时的标识)
我们了解一下 IP地址的表示方式与转换(主讲 IPV4)
*/
1.1 点分十进制
/*
点分十进制就是我们平时最常见的 IP格式, 例如 "192.168.1.101", "202.118.26.80"等等;
IP地址其实是由 32位二进制数构成, 将这 32位数字分成 4组, 每组 8位, 用十进制表示, 中间用小数点隔开
192.168.1.101
0xc0 0xa8 0x01 0x65
*/
1.2 主机字节序
/*
其实主机字节序表示的 IP格式在上面已经介绍了
192.168.1.101
⬇
0xc0 0xa8 0x01 0x65
⬇
0xc0a80165 → 主机字节序
*/
1.3 网络字节序
/*
在网络传输中, 规定使用网络字节顺序(大端模式), 不受主机,路由器的影响, 使 IP,端口等表示唯一
*/
#include
#include
#include
#pragma comment(lib,"WS2_32")
int main(int argc, char **argv)
{
long l=inet_addr("192.168.1.101");
unsigned char *ptr = (unsigned char*)&l;
printf("网络字节序为: %ld\n", l);
for (int i = 0; i < 4; ++i)
{
printf("%x ", *(ptr + i));
}
printf("\n\n");
return 0;
}
/*
Result:
网络字节序为: 1694607552
c0 a8 1 65
分析一下, "192.168.1.101"该 IP地址转换为网络字节序的结果为 1694607552,
在内存中分布是 c0 a8 01 65,
在主机字节序的表示下为 0x6501a8c0, 正好和主机字节序的表示相反, 所以结果为 1694607552
*/
2. IP地址字节序转换
/*
unsigned long inet_addr( const char FAR * cp );
功能: 将 点分十进制格式的 IP地址转换为 32位网络字节序二进制数
使用方法在 1.3网络字节序 章节中已做介绍
*/
/*
char FAR * inet_ntoa( struct in_addr in );
功能: 将网络字节序的 IP地址转换为 点分十进制字符串格式
*/
#include
#include
#include
#pragma comment(lib,"WS2_32")
int main(int argc, char *argv[])
{
struct in_addr addr1,addr2;
ulong l1,l2;
l1= inet_addr("192.168.0.74");
l2 = inet_addr("211.100.21.179");
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
return 0;
}
/*
以上函数比较旧, 只适用于 IPv4
我们推荐使用以下函数, 适用于 IPv4 和 IPv6
INT inet_pton( INT Family, PCSTR pszAddrString, PVOID pAddrBuf );
功能: 将字符串的 IP地址转换为 32位网络字节序二进制数
具体使用方法可以在 上一篇文档(网络主机字节序的转换)中详细查看
*/
/*
PCSTR inet_ntop( INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize );
功能: 将网络字节序 IP转换为 字符串格式
具体使用可以在 C++日常文件夹下 WinSock文档中详细查看
*/