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

使用Raw Socket接收OSPF报文时recv()阻塞无返回的问题排查

Raw Socket无法接收OSPF报文的排查与修复

问题背景

在VMware Ubuntu 20.04环境下,使用Raw Socket接收OSPF报文时,Wireshark能正常捕获到eNSP模拟路由器发送的OSPF包,但recv()函数始终阻塞,无法接收报文;发送Hello报文的sendto()调用正常。开启网卡混杂模式后问题依旧。

代码问题分析与修复步骤

1. 必须以Root权限运行程序

Raw Socket的创建、绑定设备、多播组操作都需要Root权限,普通用户无法完成这些操作,直接导致无法接收报文。运行程序时务必使用sudo。

2. 修正多播组加入的接口地址参数

原代码中mreq.imr_interface.s_addr = htonl(interface->ip)存在格式错误:

  • 若interface->ip是主机字节序的IP地址,htonl()会再次转换,导致接口地址不符合网络字节序要求
  • 正确做法是通过ioctl获取接口的网络字节序地址:
/* 修正多播组加入代码 */
struct ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq));
// 获取接口的网络字节序地址
struct ifreq ifr_addr;
memset(&ifr_addr, 0, sizeof(ifr_addr));
strcpy(ifr_addr.ifr_name, myconfigs::nic_name);
if (ioctl(socket_fd, SIOCGIFADDR, &ifr_addr) < 0) {
    perror("[Thread]RecvPacket: ioctl get interface address");
    close(socket_fd);
    return NULL;
}
struct sockaddr_in* nic_addr = (struct sockaddr_in*)&ifr_addr.ifr_addr;
mreq.imr_interface = nic_addr->sin_addr; // 直接使用网络字节序地址
mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.5");
if (setsockopt(socket_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
    perror("[Thread]RecvPacket: setsockopt - multicast ip add membership");
}

3. 完善错误处理与recv()调用

原代码未检查recv()返回值,且使用recv()不利于排查问题,建议替换为:

ssize_t recv_len = recvfrom(socket_fd, packet_rcv, RECV_LEN, 0, NULL, NULL);
if (recv_len < 0) {
    perror("[Thread]RecvPacket: recvfrom failed");
    continue;
}
// 后续处理需基于实际接收长度,避免内存越界

4. 验证VMware网卡模式

确保虚拟机网卡使用桥接模式,而非NAT模式。NAT模式下虚拟机与eNSP路由器不在同一广播域,无法接收多播报文。

5. 可选:开启IP_RECVALL(用于排查)

如果以上步骤无效,可以尝试开启IP_RECVALL选项强制接收所有IP报文,验证是否是IP层过滤导致:

int recvall_opt = 1;
if (setsockopt(socket_fd, IPPROTO_IP, IP_RECVALL, &recvall_opt, sizeof(recvall_opt)) < 0) {
    perror("[Thread]RecvPacket: setsockopt IP_RECVALL");
}

其他注意事项

  • 确认IPHDR_SRCIP宏的定义是否正确:IP头部的源IP地址偏移为12字节(#define IPHDR_SRCIP 12),避免因偏移错误导致后续处理异常
  • 检查防火墙规则:Ubuntu默认的ufw防火墙可能拦截OSPF报文,可临时关闭防火墙测试:sudo ufw disable

内容的提问来源于stack exchange,提问作者Xlucidator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:08:19