You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:18:04