0

私はcで生のイーサネットプログラミングに取り組んでいます。ローカルホストで実行されている2つのファイルクライアントとサーバーがあります。socket()での通信に自分のプロトコル番号を使用しています。

クライアント側では、次のコードがあります

    s = socket(PF_PACKET, SOCK_RAW, 61187);  
    unsigned char dest_mac[6]= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};  
    struct sockaddr_ll socket_address;

        socket_address.sll_family   = PF_PACKET;
        socket_address.sll_protocol = 61187;
        socket_address.sll_ifindex  = ifindex;
        socket_address.sll_hatype   = ARPHRD_ETHER;
        socket_address.sll_pkttype  = PACKET_BROADCAST;
        socket_address.sll_halen    = ETH_ALEN;
        socket_address.sll_addr[0]  = dest_mac[0];
        socket_address.sll_addr[1]  = dest_mac[1];
        socket_address.sll_addr[2]  = dest_mac[2];
        socket_address.sll_addr[3]  = dest_mac[3];
        socket_address.sll_addr[4]  = dest_mac[4];
        socket_address.sll_addr[5]  = dest_mac[5];
        socket_address.sll_addr[6]  = 0x00;
        socket_address.sll_addr[7]  = 0x00;

それから私は次のようにいくつかのデータを送信します

sent = sendto(s, buffer, ETH_HEADER_LEN, 0, (struct sockaddr*)&socket_address, sizeof(socket_address));

サーバー側では、クライアントと同じようにソケットを作成し、次のようにrecvfromを実行しています。

length = recvfrom(s, buffer, BUF_SIZE, 0, NULL, NULL);

しかし、私はサーバー側でパケットを受信しません。誰かが私に問題が何であるかを教えてもらえますか?

4

1 に答える 1

0

不完全な例から判断するのは難しいですが、SOCK_RAWを使用したい場所で を使用していると思われますSOCK_DGRAM。ではSOCK_RAW、イーサネット ヘッダーは指定した の一部であると見なされbufferます。つまり、宛先アドレスの設定は、パケットの内容とは無関係です。SOCK_DGRAMの内容はbuffer、生成されたイーサネット フレームのペイロードから取得され、ヘッダーはアドレス フィールドから取得されます。

この種のものは、テスト中に (または Wireshark や tshark と同等のもの) を実行すると、デバッグがかなり簡単ですtcpdump -neX。生成しているパケットを正確に確認できます。

于 2011-11-11T19:11:06.973 に答える