In article <3992789news.pl@rananim.ie.u-ryukyu.ac.jp>,
 kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球大学情報工学です。
> 
> In article <squbquyoujs.fsf@stellar.co.jp>, manmos@stellar.co.jp (Hideo "Sir MaNMOS" Morishita) writes
> > データや、通信のプロトコルなどで、レーコド数やオクテット数をそのデータ
> > 内に含めることは少なくないわけですが、その数値自体を含めたヘッダ長など
> > も、それに含めるかどうかは別れてくると思うのです。
> 
> 最初は「ヘッダーも含める」派だったんですが、最近、ちょっと
> 態度が変わりました。
> 
> ヘッダは大体固定長ですよね。可変になるのはデータ部分。これを
> 可変長文字列で受けるとすると、
>      read  header size
>      で、ヘッダから length を取得
>      length 分の可変長文字列を用意
>      read body 
> ってことになると思います。

例えばIPv4はヘッダが可変長ですよね。v6はヘッダがチェーンになってるけど。
こういう場合は明らかにヘッダ長を含めた方が楽なんですよね。とくにIPだと
streamみたいに、「切れ目」がわからないのでヘッダを読んでから、ボディを
読むっていう行為は必要がないのも大きい。

どうも、私はUDP(または生ipとかether packet)/SCTP系のプロトコルを扱うこ
とが少なくないので、データ全体を確保して、ポインタをずらすだけ、って話
が多いから「ヘッダ長はlength に含む」が楽なのかも知れないと、元ネタを
ポストしてから思いました。

#ただ、SCTPはLinuxとSolaris/MacOS-Xでプログラミングスタイルがまだ一定
#してないんで書きにくい。

> 
> ま、計算すれば良いだけなんで別に良いんですけどね。前は、
> 
>     header の最初に全体のパケット長を入れて、
>     とりあえず、4byte 読んで長さを見る
>     全体を読み込んで、データ部分をコピーまたは
>     データ部分へのポインタと長さを渡す
> 
> ってやってたんだけど、それだと、パケットのfreeが面倒。
> 

ああ、そういう場面の場合はmallocじゃなくてallocaを使うことが多いです。
私はjavaやらないからなぁ。

> あと、Java だと部分文字列へのポインタみたいなのを真似しようと
> すると面倒だし。

assembler/c出身者からポインタを取り上げたら、何も残りません。きっと。

ちなみにbasicでプログラムを書いている時も、文字列のアドレスを直にとっ
てきて文字列を変更したり、文字列に機械語を仕込んで、そこにcallをかけた
り。

> なので、
> 
> > 最近、外からもらう仕様は、それらのデータが含まれていない。というか、
> > 「仕様書に、どういう数値か書いてないんですけど、headerとtrailerを含め
> > ますか?」って聞いたら「普通、入れないでしょう。」見たいなことをいわれ
> > るんです。
> 
> と言うことになっているんじゃないでしょうか。

まあ、この仕様書の場合は、そんなことは全然関係なかったんですけどね。

-- 
   ___     わしは、山吹色のかすてーらが大好きでのぅ
 [[o o]]            ふぉっふぉっふぉ
   'J'     森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D  02 74 87 52 7C B7 39 37