ioctl FIONREADで取得するサイズの違い
以前書いた記事の最後より
「ただ私が検証してみると、66バイトのデータを送信しているのにも関わらず、ioctlでサイズを取得すると82バイトとなってしまいます。
これがキュー内に新しいデータが入ってしまっていることが原因なのか、型の違いによるものなのか(GoとCの通信をしています)、これが正しい挙動なのか今はわかっていません。」
ioctlで取得するサイズが違うという問題が起きました。
この原因がわかったので記事にします。
結論:ソケットの種類(SOCK_STREAMかSOCK_SEQPACKET)の違い
でした。
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")
とすれば、同じサイズが取得できました!