シミュレーション環境でネットワークデバイスをメディアアクセスコントローラとして組み込むために未処理のイーサネットフレームを送受信しようとしています。 したがって、パケットの受信は非ブロックステートメントを介して機能することが重要です。未処理のソケットでイーサネットフレームの長さを取得する(ノンブロッキング)
生のイーサネットフレームの送信はうまく動作しますが、受信パスについて私に混乱を招くことが1つあります。 1つのフレームが終了し、もう1つのフレームがどこで開始されるかを知る方法を教えてください。非ブロッキングとしてそれを設定する
device.socket = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
:
flags = fcntl(s,F_GETFL,0);
assert(flags != -1);
fcntl(s, F_SETFL, flags | O_NONBLOCK);
、その後からデータを取得するために、周期的にrecv()関数を呼び出して、私は基本的に何
は、生のソケットを開くことですソケット:
length = recv(s, buffer, ETH_FRAME_LEN_MY, 0);
私が知る限り、recv()関数はバイト数を返しますが、それは現在受信バッファで利用可能なので、私は別のフレームが開始するかどうか、あるいは私がまだ "古い"パケットを読んでいるかどうかわかりません。
実際には、イーサネットフレームの長さがヘッダーに含まれていないため、私自身でこれを行うことはできません。
ありがとうございます!
はhttps://en.wikipedia.org/wiki/Ethernet_frameを参照してください。 –
私はイーサネットプロトコルがどのように動作しているのか知っていますが、どうすればこの問題を解決できますか? ヘッダーの唯一の情報は、フレームの長さを含むことができるタイプですが、必要はありません! –
'EtherType'フィールドにはペイロードの長さを持つ2つのオクテットがあります。これで、合計フレームサイズを決定できます。 –