raw socketを使ったメモ

  • etherframeヘッダをつけずに送受信することもできる。受信するためには受信側のether I/Fをpromiscモードにすること。(送信側はpromiscにする必要無し)
    • ただし、CRC(FCS)(= 4 byte)以下のデータは、電気的なノイズ等と区別がつかないため、受信されない(tsharkで確認できない)。一方、送信はされるため、送信側のether I/Fでtcpdumpすると、確認できる。
    • なお、小さなデータを送信したときの挙動はドライバに依ると考えられる。あるPCを使って小さなデータを送信したところ、一部が壊れたMACヘッダが自動的に補完されたデータが、対向で受信された。この挙動はそのPCでのみ確認しており、バグの可能性もある。
  • raw readでは、1つのフレームを分割してreadすることは*できない*。readサイズが小さい場合、readされなかったデータは無視される。
    • 例えば、4084byteのデータがwriteされたとして、4byteと4080byteを別々にreadすることはできない。先に4byteをreadすると、その後にreadを行ったとしても、残りの4080byteをreadすることはできない。
  • 送信スレッドと受信スレッドの同時起動
    • 受信スレッドがreadしている最中に送信スレッドがwriteできるか?=> できる。
    • ただし、受信スレッドと送信スレッドで別ソケットを使っている場合、送信スレッドが送信したデータを受信スレッドがそのまま受信してしまう。受信スレッドと送信スレッドで同一の(一つの)ソケットを使っている場合は、受信スレッドは送信スレッドのデータを受信しない。