From: Takahiro Kambe Date: 2001-08-21T22:55:17+09:00 Subject: [ruby-list:31056] Re: sockaddr_in 構造体の pack In message <200108211347.WAA01111@smtp2.nifty.ne.jp> on Tue, 21 Aug 2001 22:47:02 +0900, Koji Arai wrote: > しかし,pack("vnC4x8")とするとうまくいきます。 > sin_family だけ little endian なのは変な話ですよね? sin_familyって、host orderじゃなかったかな。 > 4.3BSD reno で追加された(らしい)メンバ sin_len これは4.3BSD renoでの今は亡き(嘘)OSIサポート、可変のネットワーク・アド レスのためでした。ソケットのアドレスのうち、sin_lenとかsin_familyはホ スト上でしか意味がない、言い替えるとパケットの載っていくわけではないの でnetwork orderにする必要はそもそもありません。 > struct sockaddr_in { > uint8_t sin_len; > sa_family_t sin_family; > in_port_t sin_port; > struct in_addr sin_addr; > char sin_zero[8]; > }; > > のことも考慮すれば sin_family が 8bit, 16bit に関らず、その > 値は先頭から2byte目でないといけないような気がするのですが、 > なぜなんでしょう? sin_familyが16bitあったので、そのうちの8bit分をsin_lenにまわしたという のが真相です。こうしとけば、バイナリ互換も取れますから。 以上、問題とされているrubyの実装の正誤には直接答えない(答えられない)、 周辺の説明です。 -- 神戸 隆博(かんべ たかひろ) at home