Socket 编程
参考
UNP 第一卷
chinaunix 论坛
一、 基本知识
主机字节序和网络字节序
主机字节序即内存中存储字节的方法有:
1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址
网络字序表示网络协议在处理多字节时的顺序,一律为 big endian
主机字节序和网络字节序转换的函数:
#include <netinet/in.h>
uint16_t htons(uint16_t <16 位的主机字节序>)
uint32_t htonsl(uint32_t <32 位的主机字节序>) //转换为网络字节序
uint16_t ntohs(uint16_t <16 位的网络字节序>)
uint32_t ntohl(uint32_t <32 位的网络字节序>) //转换为主机字节序
缓冲区
每个 TCP SOCKET 有一个发送缓冲区和一个接收缓冲区,TCP 具有流量控制,所以接收
缓冲区的大小就是通知另一端的窗口的大小,对方不会发大于该窗口大小的数据;而 UDP
SOCKET 只有一个接收缓冲区无流量控制,当接收的数据报溢出时就会被丢弃
通信域(地址族)
套接字存在于特定的通信域(即地址族)中,只有隶属于同一地址族的套接字才能建立对
话。Linux 支持 AF_INET(IPv4 协议)、AF_INET6(IPv6 协议)和 AF_LOCAL(Unix 域协议)。
套接口(socket)=网络地址+端口号。,要建立一个套接口必须调用 socket 函数,套接口
有三种类型,即字节流套接口(SOCK_STREAM),数据报套接口(SOCK_DGRAM)和原始套接口
(SOCK_RAW)。定义一个连接的一个端点的两元组,即 IP 地址和端口号,称为一个套接口。
在网络连接中,两个端点所组成的四元组(即本地 IP、本地 PORT、远程 IP 和远程 PORT)
称为 socket pair,该四元组唯一的标识了一个网络连接。该情况可通过 netstat 验
证。
二、 socket 地址结构
1. IPv4 的 Socket 地址结构(定长)
Struct in_addr{
In_addr_t s_addr; // 32 位 IP 地址,网络字节序
}
Struct sockaddr_in{
Uint8_t sin_len;//IPv4 为固定的 16 字节长度
Sa_family_t sin_family; //地址簇类型,为 AF_INET
In_port_t sin_port; //16 位端口号,网络字节序