Path: jaist-news.jaist!coconuts.jaist!wnoc-tyo-news!wnoc-sfc-news!wnoc-kyo-news!kuis-news!kuee-news!aero.kyushu-u!hakata!ie.u-ryukyu.ac.jp!agent From: kono@ie.u-ryukyu.ac.jp (Shinji Kono) Newsgroups: fj.comp.lang.c,fj.unix Subject: Re: Re: ストリームソケットでデータがうまく読み込めない Date: 12 Nov 1998 09:30:41 GMT Organization: Information Engineering, University of the Ryukyus Lines: 44 Message-ID: <8978.910863233@rananim.ie.u-ryukyu.ac.jp> References: <72e2ee$2f0$1@news.naruto-u.ac.jp> Reply-To: kono@ie.u-ryukyu.ac.jp NNTP-Posting-Host: rananim.ie.u-ryukyu.ac.jp Originator: agent@rananim.ie.u-ryukyu.ac.jp Xref: jaist-news.jaist fj.comp.lang.c:2985 fj.unix:8323 河野 真治@琉球大情報工学です。 In article <72e2ee$2f0$1@news.naruto-u.ac.jp> , "keizi kounoike" writes >元記事にも,「一回で受け取るデータサイズを一定にする目的」とありましたが, >なぜ一定にする必要があるのか良く分かりませんでした。クライアント側が送 > bzero(data, DATA_SIZE+1); > while((j = recv(sock_id_new, data, DATA_SIZE, 0) > 0) { > printf("recv data = %s : resv data size = %d\n", data, j); > bzero(data, DATA_SIZE+1); > } これでは、単なるデータを通信するには便利でしょうが、TCPの上 でプロトコルを作ることができません。普通は、単なる一次元の データを送るのではなくて、 ここからここは、アドレス ここから先はデータ とか決まっているのが普通です。そのためには、どうしても一パケ ット読み込まないといけないわけ。だから、普通はパケットの先頭 に大きさを付けるか、ターミネータを付けるかどっちかにします。 ターミネータにすれば、setbuf して fgets が使えます。これは結 構便利。 WWW だって NNTP だって、そうなってますよね。 通信とコマンドのストリームを別に作ったftpのプロトコルは最低 だったとお思います。 >> data_size_amari=DATA_SIZE; >> p=data; >> while(data_size_amari>0){ >> j=recv(sock_id_new,p,data_size_amari,0); >> data_size_amari-=j; >> p+=j; >> } これは結構使うし、こんなものだと思うな。最初にパケットの 大きさを受け取って、そこまで読み出すって方が汎用性は あるでしょうけど。 あと、recv でなく read を使った方が高速な場合があるようです。 同じかと思っていたら、どうも違うらしい。 --- Shinji KONO @ Information Engineering, University of the Ryukyus 河野真治 @ 琉球大学工学部情報工学科