- 字节序:
- 主机字节序(host byte order):不同的主机有不同的字节序,x86:小端;
- 网络字节序(network byte order):大端字节序;
0. 什么是套接字
- 套接字是网络进程间的通信(网络进程间通信,又叫 network IPC)接口,进程用该接口能够与其他进程通信,无论是否在同一台计算机上,
- 套接字是对通信端点的抽象,就像文件描述符(file descriptor)是对文件的抽象表示;
1. 基本概念
socket 可以看成是用户进程(Application,工作在用户空间)与内核网络协议栈(内核空间,kernel space)的编程接口(称为套接口);
- 以实现用户空间的应用对内核网络协议栈提供的服务的访问和调用;
socket 以下的 UDP/TCP、IP、Channel 等即为内核网络协议栈;
2. IPv4 套接字地址接口
$ man 7 ip
IPv4 套接字地址结构通常也称为“网际套接字地址结构”,以sockaddr_in
命名,定义在 <netinet.h>
中:
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
- AF_INET:代表的是 IPv4 协议;
- 此外还有 Unix 域协议;
- Network byte order:网络字节序;
3. 通用地址结构
使不同协议间的套接字地址兼容。
struct sockaddr {
uint8_t sin_len;
sa_family_t sin_family;
char sa_data[14];
}
- sin_len:整个 sockaddr 结构体的长度;
- sin_family:指定该地址家族;
- sa_data:由 sin_family 决定其形式;
4. 字节序转换函数
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t hostlong);
uint16_t ntohs(uint16_t hostshort);
- h:host,表示主机(主机字节序);
- n:network,表示网络(网络字节序);
- s:short,l:long