socket编程学习笔记(1)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

大端字节序就是在内存中先存储数字的高位,这样数字的高位就存储在了内存的低地址处,小端字节序就是在内存中先存储数字的低位。
socket可以实现异构系统间通信,不同的硬件平台对整数的存放形式是不一样的,有的采用大端字节序,有的采用小端字节序。这时候必须统一字节序,统一的字节序称为网络字节序,先将发送方主机上的字节序转换为网络字节序,接收方收到后再转换为自己的字节序。

补充:x86或80x86是intel首先开发制造的一种微处理器体系结构的泛称,而基于这种微处理器体系结构搭建起来的硬件平台就成为x86平台,windows和linux都是基于x86平台的。
补充:%0x和%x都是以十六进制格式输出
vim是vi的升级版本

在这里插入图片描述
在这里插入图片描述

把32位的主机字节序转换为网络字节序
把16位的主机字节序转换为网络字节序
把32位的网络字节序转换为主机字节序
把32位的网络字节序转换为主机字节序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
unsigned int x = 0x12345678;
unsigned char* p1 = (unsigned char*)&x;
printf("%0x %0x %0x %0x\n", p1[0], p1[1], p1[2], p1[3]);
unsigned int y = htonl(x);
unsigned char* p2 = (unsigned char*)&y;
printf("%0x %0x %0x %0x\n", p2[0], p2[1], p2[2], p2[3]);
return 0;
}

输出结果是
78 56 34 12
12 34 56 78

在这里插入图片描述
老版本的转换函数

1
2
3
4
5
6
7
8
9
inet_aton、inet_aton、inet_ntoa在点分十进制(如206.168.112.96)与它长度为32位的网络字节序二进制值间转换IPv4地址
#include "arpa/inet.h"
int inet_aton(const char *strptr,struct in_addr *addrptr);
/*若字符串有效返回1,否则返回0*/
in_addr_t inet_addr(const char *strptr);
/*若字符串有效则为32位二进制网络字节序的IPv4地址,否则为INADDR_NONE*/
char *inet_ntoa(struct in_addr inadrr);
/*返回指向一个点分十进制数串的指针*/

现在使用inet_pton和inet_ntop函数
inet_pton 和 inet_ntop 这两个函数是随IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。目前更多的是用这两函数进行地址转换。

在这里插入图片描述

在这里插入图片描述