2 つの Linux ボックス間で生のイーサネット フレームを送信するコードを書いています。これをテストするには、単純なクライアント送信とサーバー受信を取得したいだけです。
クライアントが正しくパケットを作成しています (パケット スニファを使用してパケットを確認できます)。
サーバー側では、次のようにソケットを初期化します。
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
whereMY_ETH_PROTOCOL
は、ethertype として使用する 2 バイトの定数で、不要なネットワーク トラフィックが聞こえないようにします。
このソケットをインターフェースにバインドするときは、socket_addr 構造体でプロトコルを再度渡す必要があり
socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
ます。このようなコードをコンパイルして実行すると、失敗します。サーバーがパケットを認識しません。ただし、次のようにコードを変更すると、
socket_address.sll_protocol = htons(ETH_P_ALL);
サーバーはクライアントから送信されたパケット (および他の多くのパケット) を確認できるため、パケットが一致することを確認するためにパケットをチェックする必要がありますMY_ETH_PROTOCOL
。
しかし、指定されたプロトコルで送信されていないトラフィックをサーバーに聞かせたくないので、これは解決策ではありません。どうすればいいですか?