recvfrom函数中src_addr.sin_port的填充依据及实际作用咨询
recvfrom 中 src_addr.sin_port 的填充规则与实际作用
你提到的 recvfrom 函数语法如下:
#include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
填充规则
src_addr.sin_port 由操作系统内核在成功接收到报文后自动填充,规则如下:
- 取值直接取自接收到的UDP报文首部的源端口字段(IPv4场景对应
struct sockaddr_in结构体的sin_port,IPv6场景对应struct sockaddr_in6的sin6_port,逻辑一致) - 填充的值默认是网络字节序(大端序),如果需要在主机侧做数值对比、打印等操作,需要调用
ntohs()函数转换为主机字节序后再使用 - 必须在调用
recvfrom前将addrlen参数设置为对应地址结构体的长度(IPv4场景为sizeof(struct sockaddr_in)),内核才会完整填充sin_port等所有地址字段,否则可能出现字段未赋值、取值错误的问题
实际意义与作用
这个字段对接收端有很高的实用价值,常见用途包括:
- 快速回传响应:UDP是无连接协议,接收端没有提前保存对端的地址信息,收到报文后可以直接把填充好的
src_addr作为sendto的目标地址参数,直接向发送方回传响应,无需手动拼接IP和端口,大幅降低出错概率 - 区分多会话:同一个IP的主机可能通过多个不同的UDP端口同时向接收端发数据,通过
sin_port可以区分不同的发送端套接字,实现请求与响应匹配、会话绑定等逻辑 - 简易访问控制:接收端可以提前设置允许的源端口范围,校验
sin_port的取值,直接丢弃不符合要求的报文,实现轻量的安全过滤 - 网络调试排障:出现通信异常时,打印
sin_port可以快速定位问题,比如排查发送方端口配置错误、中间NAT设备修改源端口等异常场景
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

