1- 数据结构
2- 字节序
对于16位,32位的数据在内存中存放有两种方式:
大端方式:高字节数据存放在内存起始地址
小端方式:低字节数据存放在内存起始地址
检测系统大小端的测试代码:
#include "unp.h"
int
main(int argc, char **argv)
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
printf("%s: ", CPU_VENDOR_OS);
if (sizeof(short) == 2) {
if (un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
} else
printf("sizeof(short) = %d\n", sizeof(short));
exit(0);
}
网际协议使用大端字节序来传输数据
字节序转换的接口:
htons, ntohs; htonl, ntohl
3- 表达式 <-> 数值 转化接口
约定以下概念:
表达式 格式: 以字符串表示的IP地址,示例:“192.168.2.125”
数值格式 : 以数值表示的IP地址。示例0x7d02a8c0,其中192=0xc0,168=0xa8, 2=0x02, 1255=0x7d
/* 将 表达式格式的cp 转化为 数值格式inp。例如“192.168.2.125” 转化为7d02a8c0。 */
int inet_aton(const char * cp,struct in_addr *inp);
/* 将 数值格式inp 转化为 表达式格式的cp。例如 7d02a8c0 转化为 “192.168.2.125” 。 */
char * inet_ntoa(struct in_addr in);
/* 将 表达式格式的cp 转化为 数值格式inp。例如“192.168.2.125” 转化为7d02a8c0。 已废弃*/
in_addr inet_addr(const char *cp);
/* af 为协议族, 将 表达式格式的src 转化为 数值格式dst。例如“192.168.2.125” 转化为7d02a8c0。 */
int inet_pton(int af, const char *src, void *dst);
/* af 为协议族, 将 数值格式src 转化为 表达式格式的dst。例如 7d02a8c0 转化为 “192.168.2.125” 。 */
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
示例代码:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
unsigned long ip_addr;
ip_addr = inet_addr("192.168.2.125"); //设置ip点分十进制地址的地址
if(ip_addr==INADDR_NONE) // 返回值错误判断
printf("ERROR");
printf("inet_addr 192.168.2.125 -> %x\n", ip_addr); //打印转换后的网络字节序 7D02A8C0
return 0;
}
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int ip_addr;
struct in_addr inet_ip_addr;
ip_addr = inet_aton("192.168.2.125", &inet_ip_addr);
if (ip_addr == 0)
{
printf("error \n");
return 0;
}
printf("inet_aton 192.168.2.125 -> %x\n",inet_ip_addr.s_addr); //inet_aton 192.168.2.125 -> 7d02a8c0
return 0;
}
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
struct in_addr network;
network.s_addr=0x7d02a8c0; //为s_addr赋值--网络字节序
printf("IP : %s\n", inet_ntoa(network)); //"192.168.2.125"
return 0;
}
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int ret;
struct in_addr var_ip;
ret = inet_pton(AF_INET, "192.168.2.125", (void *)&var_ip);
if(ret==0)
printf("IP is not contained in address family\n");
if(ret == -1)
printf("errno: EAFNOSUPPORT\n");
printf("inet_pton 192.168.2.125 -> %x\n",var_ip.s_addr);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
char ip_buff[INET_ADDRSTRLEN]={0};
struct in_addr net_ip;
net_ip.s_addr = 0x7d02a8c0;
const char *ret;
ret = inet_ntop(AF_INET, (const void *)&net_ip.s_addr, ip_buff, sizeof(ip_buff) );
if(ret==NULL){ // 对返回值进行错误判断
if(strcmp(ret,"EAFNOSUPPORT"))
perror("AF error:");
if(strcmp(ret,"ENOSPC"))
printf("address string over setted size");
} // 会报警告
printf("inet_ntop 0x7d02a8c0 -> %s\n", ip_buff);
return 0;
}
inet_aton、inet_ntoa、inet_pton和inet_ntop_xiongsiyu979的博客-CSDN博客
IP地址转换函数inet_addr(),inet_aton(),inet_ntoa(),int_pton()_Lurora0的博客-CSDN博客