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 <stdio.h>
#include <WS2tcpip.h>
#include <WinSock2.h>
#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 <stdio.h>
#include <WS2tcpip.h>
#include <WinSock2.h>
#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文档中详细查看
*/


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值