2013-05-28 69 views
0

我试图通过ubuntu linux上的原始以太网套接字接收IEEE1722数据包。 套接字本身工作正常,我收到在网络上流动的任何单个数据包(ARP,TCP,SSDP,...),除了IEEE1722数据包。他们在我的阅读电话中不知何故被忽视,不明白为什么 - 或许你们中的某个人有想法。 数据包是具有VLAN标记和EtherType的802.1帧0x22f0 从ETH_P_ALL切换到ETH_P_8021Q或htons(0x22f0)都没有帮助。如果我改变了它,我再也收不到任何东西了。linux原始套接字 - 接收定制数据包

这是我的代码 - 有人有想法有什么问题吗?

创建套接字:

m_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 
if (m_socket < 0) 
{ 
    LOGERROR("EthRawSock", "Start(): SOCK_RAW creation failed! error: %d",errno); 
    m_socket = NULL; 
    return ErrorFileOpen; 
} 

struct ifreq ifr; 
memset(&ifr, 0, sizeof(ifr)); 
strcpy(ifr.ifr_name, m_sznic.ptrz()); 
if (ioctl(m_socket, SIOCGIFINDEX, &ifr) < 0) { 
    LOGERROR("EthRawSock", "Start(): ioctl() SIOCGIFINDEX failed! error: %d (NIC: %s)",errno,ifr.ifr_name); 
    return ErrorFileOpen; 
} 

struct sockaddr_ll sll; 
memset(&sll, 0, sizeof(sll)); 
sll.sll_family = AF_PACKET; 
sll.sll_ifindex = ifr.ifr_ifindex; 
sll.sll_protocol = htons(0x22f0); 

if (bind((int)m_socket, (struct sockaddr *) &sll, sizeof(sll)) < 0) { 
    LOGERROR("EthRawSock", "Start(): bind() failed! error: %d",errno); 
    return ErrorFileOpen; 
} 

if (ioctl(m_socket, SIOCGIFHWADDR, &ifr) < 0) 
{ 
    LOGERROR("EthRawSock", "Start(): SIOCGIFHWADDR failed! error: %d",errno); 
    return ErrorFileOpen; 
} 

struct packet_mreq mr; 
memset(&mr, 0, sizeof(mr)); 
mr.mr_ifindex = sll.sll_ifindex; 
mr.mr_type = PACKET_MR_PROMISC; 

if (setsockopt(m_socket, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) { 
    LOGERROR("EthRawSock", "Start(): setsockopt() PACKET_ADD_MEMBERSHIP failed! error: %d",errno); 
    return ErrorFileOpen; 
} 

经由读:

n大小=读(m_socket,m_recv_buffer,ETH_FRAME_LEN);

回答

0

您是否在此界面上尝试过wiresharktshark? Wireshark应该能够获得这些数据包 - 不确定是否需要启用它。如果我没有弄错,所有的网络端口都必须支持802.1AS。 IEEE 1722需要硬件支持,我认为如果不知道这是如何设置的,它将不可能帮助你。

+0

是的,wireshark可以看到数据包,我只是不通过原始套接字获取它们。不知道是否必须确定任何特殊的接收VLAN帧 - 这似乎是ARP,SSDP和IEEE1722数据包之间的唯一区别。 最坏的情况我切换libpcap,只是很好奇我做错了什么。 – user2429124

+0

噢..关于硬件支持:它是我发送到网络的一组抓包。他们通过路由器并到达接口(SRP,gPTP&co不受路由器支持,如果您的意思是支持硬件......但这不是问题,我只想在我的端点上接收这些数据包=) ) – user2429124

1

我的两美分贡献: AVTP流运行在一个标记帧,这意味着你不会在预期的偏移量(从数据包开始12个字节,紧跟在目标和源MAC地址之后)找到ethertype 0x22f0 - 这将是4个八位字节。 VLAN标记帧的ethertype通常是0x8100。

相关问题