如何从request_sock获取Socket监听端口?ir_num取值异常排查
问题原因与解决方法
你对ir_num的理解没错,它确实对应TCP监听端口,问题出在字节序未转换。
内核中所有TCP端口均以**网络字节序(大端)**存储,你代码里对远端端口sport调用了ntohs()转换为主机字节序,但本地监听端口dport(即ir_num)漏做了这一步:
- 真实监听端口8000的十六进制为
0x1F40,网络字节序下存储为0x1F 0x40 - 小端系统直接读取时会解析为
0x401F,换算成十进制就是你日志里的16415
修改代码
在读取dport后添加字节序转换:
bpf_probe_read(&dport, sizeof(dport), (void *)&ireq->ir_num); dport = ntohs(dport); // 新增这一行
修改后重新运行,日志里的dport就会显示正确的监听端口8000了。
内容的提问来源于stack exchange,提问作者Paul Zhang
相关产品推荐
相关产品推荐

