Commentsこの記事はビール飲みながら書きました。アルコール入ってるので間違ってたり変なこと言ってたらごめんなさい。おびーるおいちい!!!!Qiitaデビュー兼ねてこの記事の微修正入れたりしつつ投稿しました。socketではタグが消されてしまうことがわかった。結論から言うと結構弄めんどくさかったのでそのメモ。こんな感じのコードを書きました。socketでフレームを受信するだけ。socketでは802.1Qタグが綺麗に取り除かれていますね。してもタグが必要だったので色々調べたのですが、日本語情報もなく、英語情報を見ても「libpcap使え」と出てきます。「じゃあそのlibpcapはどう実装されてるのさ!!」というツッコミは置いといて。socketで単純にread()しても、VLANタグは早い段階で取り除かれ、ユーザーランドに上がってくる頃にはタグなしフレームになってるそうです。switchというOSSがあります。socket実装もあるそうなので、Lagopusの実装を見てみましょう。「lagopus/src/dataplane/mgr/sock_io.c」がsocketとかの処理っぽいです。socket作成部分。modeの設定とか、MTUの設定なので省略*/}ただのソケットの作成なので、僕が書いたコードとやってることはそんなに変わらない。0)」というのが何かしてそうです。調べてみると、ソケットオプションを設定する機能らしい。RECVSOL_PACKETで受信したパケットすべてに対して適用、PACKET_AUXDATAをセットすることで補助データを受信できるようです。recvmsg()でパケットデータとこの補助データを受信して、補助データについてはcmsgを使って読むそうです。いえ、実際のコードがないと使い方もよくわからないので、続いてLagopusの受信部分を読んでみます。pktlen;}recvmsgでデータを受信したあと、何かしらやってますね。これを参考に802.1Qタグ付きフレームを受信するコード書いてみました。len);printf("\n");}}return(0);何をやってるかはコード中のコメント参照。補助データからタグに入れるべき内容を読んできて、フレームの適切な位置に挿入してるだけです。ビルドしてコードを動かして最初と同じようにタグ付きフレームを受信してみましょう。................^Croot@Capella:~/vlan#できました。複数のinterfaceを扱うときはpoll()とかepoll()とか使ってノンブロッキングにしたほうが良いです。)ググっても日本語情報どころか、他言語でも有力な情報がなく、結局OSSのコードリーディングをすることに。Socket対応してるという話は知ってたので、今回参考にできました。)OSSの偉大さを実感できました。余談ですが、職業がネットワーク屋さんということで普段はルータとかスイッチばっかり触ってます。Socketを使ったL2SWみたいなのを作ってます。requestとかはあまり受け付ける気はないです、ごめんなさい)最初はCで実装してたのですが、だんだんしんどくなってC++に。標準ライブラリに頼らず(iostreamとかcstdintくらいは使ってる)、スマートポインタも使わないつもりで作っていこうと思ってます。メモリ管理とかも含めて学びたいので、生産性とかよりお勉強優先です。socketのVLANの扱いでハマったので、この記事を書きました。これだけの内容で、ぼくのお休み2日が潰れました。参考になれば幸いです。