网络字节序和socket地址结构

主机字节序和网络字节序

​ 主机字节序分为大端字节序和小段字节序,不同的主机采用的字节序列可能不同。大端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。小段字节序是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处。在两台使用不用字节序的主机之间传递数据时,可能会出现冲突。所以,在将数据发送到网络时规定整形数据使用大端字节序,所以也把大端字节序称为网络字节序列。对方接收到数据后,可根据自己的字节进行转换。

1
2
3
4
5
6
这是Linux系统提供的4个函数来完成转换
#include <netinet/in.h>
unit32_t htonl(uint32_t hostlong); //长整型的主机字节序转网络字节序
unit32_t ntohl(uint32_t netlong); //长整型的网络字节序转主机字节序
unit32_t htons(uint16_t hostshort); //短整型的主机字节序转网络字节序
unit32_t ntohs(uint16_t netshort); //短整型的网络字节序转主机字节序

socket地址结构

通用的socket地址结构

socket网路编程接口中表示socket地址的是结构体sockaddr,如下

1
2
3
4
5
6
#include <bits/socket.h>
struct sockaddr
{
sa_family_t sa_family; //sa_family成员是地址族类型(sa_family_t)的变量
char sa_data[14]; //地址数据
}

常用的协议族和对应的地址族如下图

专用的socket地址结构

TCP/IP协议族有sockaddr_in和sockaddr_in6两个专用的socket地址结构体,分别位于IPV4和IPV6:

1
2
3
4
5
6
7
8
9
10
11
#include <bits/socket.h>
struct in_addr
{
u_int32_t s_addr; //4字节的整型值
};
struct sockaddr_in
{
sa_family_t sin_family; //AF_INET
u_int16_t sin_port; //short类型的整型值:端口号
struct in_addr sin_addr;
};

什么是端口号?

​ 网络通信实际上是运行在两个不同终端上的进程之间的通信。

​ 在网络中通过IP地址可以标识一个主机

​ 运行在主机上的进程是通过端口号来标识的。

专用的socket地址结构中,IP地址是一个4字节的整型值,一般是使用点分十进制的的字符串来标识IP地址的,如何将点分十进制的IP地址转化为4字节的整型值。

​ 4个字符串化成整型也就在0~255之间,直接采用整型变量存。

1
2
3
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp); //字符串表示的IPV4地址转化为网络字节序
char* inet_ntoa(struct in_addr in); //IPV4地址的网络字节序转化为字符串表示

撒花完结。。。