Path: sranha!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 25 Dec 90 22:08:39 Organization: Software Research Associates, Inc.,Japan In-reply-to: nisimura@srava.sra.co.jp's message of 17 Dec 90 07:51:30 GMT Newsgroups: sra.unix Subject: Re: TCP send buffer size Distribution: sra References: <4886@srava.sra.co.jp> Merry Hacking! (意味まったく不明) 記事 <4886@srava.sra.co.jp> で nisimura@srava.sra.co.jp (Tohru Nisimura) さんいはく > そのコードで述べられている事実だけでは、先の結論は引き出せません。 > ここよ、ここ⇒⇒⇒ error = プロトコルルーチンに送信願い(m のリスト, .....); > > で、スリープするの、しないの? どっち? > どうゆう時にここがエラーになるの? スリープしているところはないような気がします。 エラーは沢山の場合があって、私にはよくわかりません。 > 送信バッファメモリの獲得可否でエラーになる可能性よりも、 > こっちの方が本質的じゃないか。 どこでエラーが起きるのかとか、いつスリープするのかとかは、当然 sosend() だけ見ていてはわからなくて、tcp_usrreq, tcp_output, ip_output, インターフェース物理層への output とどんどん掘り下げていかなければ ならないですよね。 > sosend() には STREAM のコードは入ってないし。 ううー。ストリームとか考えると、やっぱり、PUSH される可能性がある モジュール全部について考えたりするんですか?...... (私は全然わかりません。) で、私もメモリーの獲得がどう行なわれるかとか、ソケットの具体的な 仕組みを明らかにするつもりはなくて、......シグナル(実装でいえば sleep からの longjmp)を除けば ・ write() が正常に終るためには sosend() が返り値 0 でリターンする 『必要』がある。 ・ sosend() が返り値 0 でリターンするのは、全部送られた時だけである。 ・ よって、write() が正常に終るのは、全部送られた時だけである。 ということがいいたかったのです。 # ここで「全部送られた」というのは、データが実際に送られたかどうかでも、 # あるいはプロトコルルーチン(tcp)にちゃんとわたったかどうかでもなく、 # write() の返り値(u.u_r.rval とか、uio->uio_resid とかのあたり)が # write しようとした大きさに等しくなっているかどうかのみに着目して # いっています。(uio->uio_resid の値の変化は、実は sosend() の中の # uiomove() という関数のなかに隠れていて、私も前の記事で言及しません # でした。) さらに、 > ここよ、ここ⇒⇒⇒ error = プロトコルルーチンに送信願い(m のリスト, .....); で、エラーが発生すれば絶対 write() は -1 を返すから問題なし。 また、この中でスリープするところがあっても戻ってくればそれでよし、 よしんばlongjmp して戻ってこない可能性があったとしても、スリープの 中から longjmp するのはシグナルが起きた時だけだから(このときは確かに write() が中途半端に終ることがあるとがわかっているので)解決ずみ、 と言おうとしたのです。 やはり間違っているでしょうか?(確かに少し話が簡単過ぎる気はします。) # 年越し確実 -- ----____----____ 渡邊克宏@ソフトウェア工学研朽所