我試圖通過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);
是的,wireshark可以看到數據包,我只是不通過原始套接字獲取它們。不知道是否必須確定任何特殊的接收VLAN幀 - 這似乎是ARP,SSDP和IEEE1722數據包之間的唯一區別。 最壞的情況我切換libpcap,只是很好奇我做錯了什麼。 – user2429124
噢..關於硬件支持:它是我發送到網絡的一組抓包。他們通過路由器併到達接口(SRP,gPTP&co不受路由器支持,如果您的意思是支持硬件......但這不是問題,我只想在我的端點上接收這些數據包=) ) – user2429124