0

ubuntu Linuxで生のイーサネットソケットを介してIEEE1722パケットを受信しようとしています。ソケット自体は正常に動作します。IEEE1722 パケットを除いて、ネットワーク上を流れる単一のパケット (ARP、TCP、SSDP、....) を受信します。それらは私の読み取り呼び出しでどういうわけか無視され、その理由がわかりません-おそらくあなたの誰かが考えを持っています. パケットは、VLAN タグと EtherType 0x22f0 を持つ 802.1 フレームです。ETH_P_ALL から ETH_P_8021Q または htons(0x22f0) への切り替えは役に立ちません。それを変更すると、もう何も受け取りません。

それが私のコードです - 何が悪いのか考えている人はいますか?

ソケットの作成:

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;
}

読み方:

nsize = read(m_socket,m_recv_buffer,ETH_FRAME_LEN);

4

2 に答える 2

1

私の 2 セントの貢献: AVTP ストリームはタグ付きフレームで実行されます。これは、予想されるオフセット (パケットの先頭から 12 オクテット、宛先および送信元 MAC アドレスの直後) でイーサタイプ 0x22f0 が見つからないことを意味します - それは 4 オクテットになりますその後。VLAN タグ付きフレームのイーサタイプは通常 0x8100 です。

于 2013-07-03T14:10:08.573 に答える
0

このインターフェイスを試しましたwiresharktshark? Wireshark はこれらのパケットを正常に取得できるはずですが、有効にする必要があるかどうかはわかりません。私が間違っていなければ、すべてのネットワーク ポートが 802.1AS をサポートしている必要があります。IEEE 1722 にはハードウェア サポートが必要であり、これがどのように設定されているかを知らずにあなたを助けることは不可能だと思います。

于 2013-05-28T19:01:05.067 に答える