1.大小端模式
1. 大端模式:低地址存储高字节
小端模式:低地址存储低字节
2.网络传输统一使用大端模式作为网络字节序,而计算机大多数为小端模式
3.大小端转化函
(1)头文件 #include <arpa/inet.h>
(2)函数
uint32_t htonl(uint32_t hostlong); //主机字节序转化为网络字节序 long 类型
uint16_t htons(uint16_t hostshort); //主机字节序转化为网络字节序short类型
uint32_t ntohl(uint32_t netlong); //网络字节序转化为主机字节序 long 类型
uint16_t ntohs(uint16_t netshort); //网络字节序转化为主机字节序short类型
2.地址转化函数
一般我们所用的如192.168.10.3这类IP地址是点分式十进制,在网络传输时需要转化为32位无符号整数
点分式10进制转化32位无符号整数函数
(1)头文件 #include <arpa/inet.h>
(2)int inet_pton(int af, const char *src, void *dst);
功能:将一个点分式10进制 IP字串转化为一个 32位无符号整数
参数:
af 协议族 AF_INET : IPV4 AF_INET6 :IPV6 ...
src: 表示一个不可以修改的字符串 即点分式十进制数串
dst: 是一个地址 这个地址用于存储32位无符号的整数
返回值: 成功返回 1 失败返回 -1 错误码填充再 errno中
注意:最后出来的存储 内容并不是小端存储 而是 以网络字节序存储
32位无符号整数转化点分式10进制函数
(1)头文件 #include <arpa/inet.h>
(2) const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
功能:将一个32位的无符号整数IP地址 转化位 十进制点分式IP地址
参数:
af 即协议族,同上
src 存储32位数据的地址
dst 即存储点分式字符串的首地址
len 即缓冲区的长度定义的 因为 IPV4 和 IPV6的协议地址长度是不同
定义了两个宏
#define INET_ADDRSTRLEN 16 缓冲区长度占16个字节
#define INET6_ADDRSTRLEN 46
返回值:成功返回 存储的首地址 失败返回 NULL
3.存储IP地址端口的结构体
下面两个结构体可存储绑定socket的IP地址和端口号,一般使用第二个
1.struct sockaddr {
sa_family_t sa_family; //指的是协议族 即你的地址结构体中需要协议族这个内容
char sa_data[14]; //存储地址和端口号等信息的
}
2.头文件:#include <netinet/in.h >
struct sockaddr_in {
sa_family_t sin_family; //协议族 AF_INET : IPV4 AF_INET6 :IPV6 ...
in_port_t sin_port; // 端口号
struct in_addr sin_addr; // IP地址
};
struct in_addr{
u32_i s_addr; //无符号的32位数据 表示 32位的地址
}
ps:以上的结构体中存储的数据必须是网络字节序
4.举例
因此,一般绑定socket的地址设定如下
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(88);//88端口号
saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //127.0.0.1 IP地址
5.端口号
6.INADDR_ANY
我们有时会遇到addrServer.sin_addr.s_addr = htonl(INADDR_ANY)这种定义,那么INADDR_ANY代表什么意思呢?
INADDR_ANY转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。
比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢?
如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3个ip,也就等于需要管理3个套接字进行数据交换,这样岂不是很繁琐?
所以出现INADDR_ANY,你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,只要是绑定的端口号过来的数据,都可以接收到。