目录
一.固定宽度整数类型(C++11引入)
[二、socket 常见API](#二、socket 常见API)
socket
bind
IP地址绑定类型
[TCP 编程模型流程图](#TCP 编程模型流程图)
listen
accept
connect
UDP编程模型流程图
[recvfrom 函数](#recvfrom 函数)
[sendto 函数](#sendto 函数)
[常用 flags 选项](#常用 flags 选项)
常用错误码
三、netstat
[Linux/Unix 选项及常用组合选项](#Linux/Unix 选项及常用组合选项)
一.固定宽度整数类型(C++11引入)
头文件<cstdint>
| 类型 |
宽度 |
有符号 |
取值范围 |
格式化字符串 |
典型用途 |
uint16_t |
16位 |
无符号 |
0 ~ 65535 |
%hu (C) / cout (C++) |
端口号、网络数据包长度、Unicode字符 |
int16_t |
16位 |
有符号 |
-32768 ~ 32767 |
%hd (C) / cout (C++) |
音频采样、传感器数据、小范围整数 |
uint32_t |
32位 |
无符号 |
0 ~ 4294967295 |
%u (C) / cout (C++) |
IPv4地址、文件大小、时间戳 |
int32_t |
32位 |
有符号 |
-2147483648 ~ 2147483647 |
%d (C) / cout (C++) |
普通整数计数器、RGB颜色值 |
uint64_t |
64位 |
无符号 |
0 ~ 2^64-1 |
%llu (C) / cout (C++) |
大文件大小、高精度时间戳 |
int64_t |
64位 |
有符号 |
-2^63 ~ 2^63-1 |
%lld (C) / cout (C++) |
时间戳、大数据处理 |
uint8_t |
8位 |
无符号 |
0 ~ 255 |
%hhu (C) / cout (C++) |
字节流、二进制数据 |
int8_t |
8位 |
有符号 |
-128 ~ 127 |
%hhd (C) / cout (C++) |
小整数、字符数据 |
- 跨平台一致性:在不同系统上大小固定,避免int在不同平台长度不同的问题
- 网络通信:确保数据包结构的字节对齐和大小一致
- 内存优化:精确控制内存使用,特别适合嵌入式系统和网络协议设计
- 可读性强:类型名称直接表明变量的大小和符号
二、socket 常见API
socket
| 项目 |
说明 |
| 函数名 |
socket |
| 头文件 |
<sys/socket.h> |
| 原型 |
int socket(int domain, int type, int protocol); |
| 参数1 |
domain:协议域/地址族,如 AF_INET(IPv4)、AF_INET6(IPv6)、AF_UNIX(本地) |
| 参数2 |
type:套接字类型,如 SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)、SOCK_RAW(原始) |
| 参数3 |
protocol:指定协议,通常填0(自动选择),也可指定如 IPPROTO_TCP、IPPROTO_UDP |
| 返回值 |
成功返回文件描述符(非负整数),失败返回 -1,设置 errno |
| 功能 |
创建一个套接字,返回文件描述符供后续操作使用 |
| 适用 |
TCP/UDP,客户端 + 服务器 |
Socket的第一个参数(如AF_INET、AF_UNIX)用于指定通信协议族,它决定了套接字使用的网络协议类型(IPv4/IPv6/本地IPC等)、地址格式及底层传输方式,是后续地址绑定、数据传输等操作的基础,必须与后续操作匹配且直接影响通信效率和适用场景
bind
| 项目 |
说明 |
| 函数名 |
bind |
| 头文件 |
<sys/socket.h> |
| 原型 |
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
| 参数1 |
sockfd:socket 函数返回的文件描述符 |
| 参数2 |
addr:指向协议地址结构的指针(如 struct sockaddr_in) |
| 参数3 |
addrlen:地址结构的大小 |
| 返回值 |
成功返回 0,失败返回 -1,设置 errno |
| 功能 |
将套接字与本地 IP 地址和端口号绑定 |
| 适用 |
TCP/UDP,服务器(客户端通常不需要,系统自动分配临时端口) |
IP地址绑定类型
| 绑定类型 |
代码示例 |
接收范围 |
适用场景 |
优点 |
缺点 |
网络可达性 |
| INADDR_ANY |
s_addr = INADDR_ANY |
所有接口的所有IPv4地址 |
通用服务器、多网卡服务器 |
一个socket接收所有IP,配置简单 |
无法区分具体IP来源 |
本机所有IP均可访问 |
| 回环地址 |
s_addr = inet_addr("127.0.0.1") |
仅本机回环接口 |
本地进程通信、调试、数据库本地连接 |
安全,只允许本机访问 |
外部无法访问 |
仅限本机 |
| 公网IP |
s_addr = inet_addr("1.2.3.4") |
仅该公网IP |
对外服务(物理机) |
对外提供服务 |
配置较复杂 |
公网可达 |
客户端无需显式绑定端口 ,操作系统会在首次调用sendto发送数据时,自动从动态端口范围(通常为49152-65535)中随机选择一个未被占用的端口进行绑定,这种机制保证了同一主机上多个客户端进程的端口唯一性,避免了手动绑定可能导致的端口冲突和进程启动失败问题;而服务器必须显式绑定固定知名端口,以便客户端能够稳定访问,如果端口被占用则服务启动失败,因此服务器端需做好端口规划和管理
TCP 编程模型流程图
复制代码
服务器端: 客户端:
socket() ────────────────── socket()
│ │
│ │
bind() (绑定端口) │
│ │
│ │
listen() (开始监听) │
│ │
│ │
accept() (阻塞等待) ←──────── connect() (发起连接)
│ │
│ │
新套接字 ←─ 三次握手 ──────────→ 连接建立
│ │
│ │
read()/write() <─────> read()/write() (数据通信)
│ │
│ │
close() close()
listen
| 项目 |
说明 |
| 函数名 |
listen |
| 头文件 |
<sys/socket.h> |
| 原型 |
int listen(int sockfd, int backlog); |
| 参数1 |
sockfd:已绑定的套接字文件描述符 |
| 参数2 |
backlog:未完成连接队列的最大长度(等待 accept 的连接数) |
| 返回值 |
成功返回 0,失败返回 -1,设置 errno |
| 功能 |
将套接字由主动态转变为被动态,开始监听客户端连接请求 |
| 适用 |
TCP,服务器 |
accept
| 项目 |
说明 |
| 函数名 |
accept |
| 头文件 |
<sys/socket.h> |
| 原型 |
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
| 参数1 |
sockfd:监听套接字(listen 后的套接字) |
| 参数2 |
addr:指向协议地址结构的指针,用于返回客户端的地址信息 |
| 参数3 |
addrlen:地址结构的长度(值-结果参数) |
| 返回值 |
成功返回新的已连接套接字文件描述符,失败返回 -1 |
| 功能 |
从已完成连接队列中取出第一个连接,返回一个新套接字用于与客户端通信 |
| 适用 |
TCP,服务器 |
connect
| 项目 |
说明 |
| 函数名 |
connect |
| 头文件 |
<sys/socket.h> |
| 原型 |
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
| 参数1 |
sockfd:socket 函数返回的套接字文件描述符 |
| 参数2 |
addr:指向服务器地址结构的指针(IP + 端口) |
| 参数3 |
addrlen:地址结构的大小 |
| 返回值 |
成功返回 0,失败返回 -1 |
| 功能 |
客户端主动向服务器发起连接请求(TCP 三次握手) |
| 适用 |
TCP,客户端 |
UDP编程模型流程图
复制代码
服务器端: 客户端:
socket() ──────────────────── socket()
│ │
│ │
bind() (绑定端口) │
│ │
│ │
│ │
│ │
recvfrom() (阻塞等待) ←─────── sendto() (发送数据)
│ │
│ (收到数据,获取客户端地址) │
│ │
sendto() (发送数据) ──────────→ recvfrom() (接收数据)
│ │
│ │
│ │
│ │
close() close()
recvfrom 函数
| 项目 |
说明 |
| 函数名 |
recvfrom |
| 头文件 |
Linux/Unix: <sys/socket.h> Windows: <winsock2.h> |
| 原型 |
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen) |
| 参数1 |
sockfd:socket 文件描述符 |
| 参数2 |
buf:接收数据缓冲区的指针 |
| 参数3 |
len:缓冲区大小(字节数) |
| 参数4 |
flags:控制选项,通常设为 0 |
| 参数5 |
src_addr:输出参数,存储发送方地址结构的指针 |
| 参数6 |
addrlen:输入输出参数,传入地址结构大小,返回实际地址大小 |
| 返回值 |
成功返回接收到的字节数,失败返回 -1,设置 errno |
| 功能 |
从无连接 socket(如 UDP)接收数据,并获取发送方地址信息 |
| 适用 |
主要适用于 UDP,也可用于 TCP(但不常用) |
sendto 函数
| 项目 |
说明 |
| 函数名 |
sendto |
| 头文件 |
Linux/Unix: <sys/socket.h> Windows: <winsock2.h> |
| 原型 |
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) |
| 参数1 |
sockfd:socket 文件描述符 |
| 参数2 |
buf:待发送数据的缓冲区指针 |
| 参数3 |
len:要发送的数据长度(字节数) |
| 参数4 |
flags:控制选项,通常设为 0 |
| 参数5 |
dest_addr:目标地址结构体指针 |
| 参数6 |
addrlen:目标地址结构体大小 |
| 返回值 |
成功返回实际发送的字节数,失败返回 -1,设置 errno |
| 功能 |
向指定地址的 socket 发送数据,无需预先建立连接 |
| 适用 |
主要适用于 UDP,也可用于 TCP(但不常用) |
常用 flags 选项
| flags |
适用函数 |
说明 |
| MSG_DONTWAIT |
recvfrom, sendto, recv, send |
非阻塞操作 |
| MSG_WAITALL |
recv, recvfrom |
等待直到缓冲区满 |
| MSG_PEEK |
recv, recvfrom |
查看数据但不从队列移除 |
| MSG_OOB |
recv, send, recvfrom, sendto |
发送/接收带外数据 |
| MSG_NOSIGNAL |
send, sendto |
不发送 SIGPIPE 信号 |
| MSG_CONFIRM |
sendto |
确认路径有效 |
常用错误码
| errno |
适用函数 |
说明 |
| EAGAIN/EWOULDBLOCK |
recvfrom, sendto, recv, send |
非阻塞模式下无数据/缓冲区满 |
| EBADF |
所有函数 |
无效的文件描述符 |
| ECONNREFUSED |
sendto, connect |
远程主机拒绝连接 |
| EINTR |
所有阻塞函数 |
系统调用被信号中断 |
| EINVAL |
所有函数 |
参数无效 |
| EMSGSIZE |
sendto |
消息太大 |
| ENOTCONN |
recv, send |
套接字未连接 |
| EADDRINUSE |
bind |
地址已被使用 |
| EACCES |
bind, connect |
权限不足 |
三、netstat
| 项目 |
说明 |
| 命令名 |
netstat |
| 全称 |
Network Statistics |
| 功能 |
显示网络连接、路由表、接口统计等信息 |
| 适用系统 |
Linux/Unix、Windows、macOS |
命令格式:netstat 选项
Linux/Unix 选项及常用组合选项
| 选项 |
说明 |
| -a |
显示所有连接和监听端口 |
| -t |
仅显示 TCP 连接 |
| -u |
仅显示 UDP 连接 |
| -l |
仅显示监听状态的套接字 |
| -n |
以数字形式显示地址和端口(不解析域名) |
| -p |
显示进程 PID 和名称 |
| -r |
显示路由表 |
| -i |
显示网络接口统计信息 |
| -s |
显示各协议统计信息 |
| -c |
持续输出(每秒钟刷新) |
| -e |
显示扩展信息 |
| -o |
显示定时器信息 |
| 组合选项 |
命令 |
说明 |
使用场景 |
| -tuln |
netstat -tuln |
查看所有监听端口(最常用) |
检查服务是否启动 |
| -tulnp |
sudo netstat -tulnp |
查看监听端口及对应进程 |
查找端口占用 |
| -an |
netstat -an |
查看所有连接(数字显示) |
网络连接概览 |
| -ant |
netstat -ant |
查看所有 TCP 连接 |
分析 TCP 连接状态 |
| -anu |
netstat -anu |
查看所有 UDP 连接 |
分析 UDP 通信 |
| -rn |
netstat -rn |
查看路由表 |
路由问题排查 |