roto11fonの日記

技術系の話を書いたりしてます。

ioctl FIONREADで取得するサイズの違い

以前書いた記事の最後より 

「ただ私が検証してみると、66バイトのデータを送信しているのにも関わらず、ioctlでサイズを取得すると82バイトとなってしまいます。
これがキュー内に新しいデータが入ってしまっていることが原因なのか、型の違いによるものなのか(GoとCの通信をしています)、これが正しい挙動なのか今はわかっていません。」

roto11fon.hatenablog.com

ioctlで取得するサイズが違うという問題が起きました。

 

この原因がわかったので記事にします。

 

結論:ソケットの種類(SOCK_STREAMかSOCK_SEQPACKET)の違い

でした。

 

 C言語

int sock = socket(PF_UNIX, SOCK_SEQPACKET, 0);

 

というように私がやりたかったのは、SOCK_SEQPACKETを使った通信でした。

 

Go言語 

l, _ := net.Listen("unix", "path")

 

GoでもSOCK_SEQPACKETを使った通信をするコードを書いたつもりでした。

しかし、これは間違いです。

"unix"はSOCK_STREAMに値します。

 

こちらのサイトに答えがありました。

ASCII.jp:Unixドメインソケット (1/2)|Goならわかるシステムプログラミング

なんと"unix"や"tcp"の他に"unixpacket"というものがあるらしいです。

"unixpacket"がSOCK_SEQPACKETでした。

 

net - The Go Programming Language

公式ドキュメントにもunixpacketの存在は書いてましたが、SOCK_SEQPACKETであることは書いてなくて、コードまで読まないといけませんでした。

 

なので、Goの方を

l, _ := net.Listen("unixpacket", "path")

とすれば、同じサイズが取得できました!