Linux 之 【网络套接字编程】(固定宽度整数类型、socket常见API、netstat)

目录

一.固定宽度整数类型(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++) 小整数、字符数据
  1. 跨平台一致性:在不同系统上大小固定,避免int在不同平台长度不同的问题
  2. 网络通信:确保数据包结构的字节对齐和大小一致
  3. 内存优化:精确控制内存使用,特别适合嵌入式系统和网络协议设计
  4. 可读性强:类型名称直接表明变量的大小和符号

二、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_TCPIPPROTO_UDP
返回值 成功返回文件描述符(非负整数),失败返回 -1,设置 errno
功能 创建一个套接字,返回文件描述符供后续操作使用
适用 TCP/UDP,客户端 + 服务器

Socket的第一个参数(如AF_INETAF_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 查看路由表 路由问题排查
相关推荐
huaweichenai4 小时前
Linux安装http-server并部署html静态站点
linux·运维·服务器
Gss7774 小时前
Linux 正则表达式详解(基础 + 扩展 + 实操)
linux·运维·正则表达式
北冥湖畔的燕雀4 小时前
Linux权限与Vim,gcc以及make/makefile操作全解析
linux·运维·服务器
代码游侠4 小时前
Linux驱动复习——驱动
linux·运维·arm开发·笔记·学习
国科安芯4 小时前
医疗成像设备系统电源芯片国产替代可行性研究
网络·单片机·嵌入式硬件·fpga开发·硬件架构
LuDvei5 小时前
LINUX文件操作函数
java·linux·算法
枷锁—sha5 小时前
【CTFshow-pwn系列】03_栈溢出【pwn 053】详解:逐字节爆破!手写 Canary 的终极破解
网络·笔记·安全·网络安全
k7Cx7e5 小时前
宝塔域名强制SSL和带www的方法
网络·网络协议·ssl
czxyvX6 小时前
017-Linux-网络基础概念
linux·网络