Path: galaxy.trc.rwcp.or.jp!sokai!inet-gw!cae-gw!ntt-twins!nttlab!rkna50!s.u-tokyo!ccut!creamy!icsts1!saitoh From: saitoh@icsts1.osaka-u.ac.jp (SAITOH Akinori) Newsgroups: fj.unix Subject: Re: Some questions about socket Message-ID: <6223@icsts1.osaka-u.ac.jp> Date: 30 Oct 90 08:06:50 GMT References: <6374@piyopiyo.hatori.t.u-tokyo.ac.jp> <6440@piyopiyo.hatori.t.u-tokyo.ac.jp> Distribution: fj Organization: tokura-lab., Osaka Univ., Japan Lines: 93 Xref: galaxy.trc.rwcp.or.jp fj.unix:1335 X-originally-archived-at: http://galaxy.rwcp.or.jp/text/cgi-bin/newsarticle2?ng=fj.unix&nb=1335&hd=a X-reformat-date: Mon, 18 Oct 2004 15:18:22 +0900 X-reformat-comment: Tabs were expanded into 4 column tabstops by the Galaxy's archiver. See http://katsu.watanabe.name/ancientfj/galaxy-format.html for more info. In article <6440@piyopiyo.hatori.t.u-tokyo.ac.jp>, oosa@piyopiyo.hatori.t.u-tokyo.ac.jp (Kinya Osa) writes: > 大佐@東大電気です。 > In article hide@cs.uec.ac.jp (Hidehiro Ishii) writes: > > どっちかというと fj.questions.unix の方が適していると思いますけど。 > 確かにそうですね。ポストした後で、fj.questions.unixとfj.unix > のクロスポストにすれ > ば良かったかな、と思ってました。あえて移ることはしませんがよろしいでしょうか? そんなことはないです。fj.unix でいいですよね。逆に fj.questions.unix に 投稿されたら、Followup-To: はfj.unix にして欲しいくらいです。 『質問は fj.question.XXX』じゃないですよ。『fj.XXX に質問を出したいけど、 ボクは気が弱いので気後れしちゃう、、、』という人のために、fj.question を 作ったのです。 質問の記事を fj.unix から追い出すためではありません。 (そりゃ、『あのぉ、マイナスで始まるファイル名のファイルを消 すにはどうするの』とかいう質問は 正直言って fj.question.unix にしてくれたほうがありがたいんだけどね、、、、) おっと、 fj.comp.comm はクロスポストしてもいいかもしれない。 ついでに一言、1行が長すぎますよ。勝手に行を fold させてもらいます。 > 質問が不明確でしたので、少し補足しながら説明したいと思います。 > そのプログラムは、とりあえずはできたのですが、画像データの > 転送に失敗してSIGPIPE(broken pipe)と表示して止まってしまう > ことが時々起こるため、プログラムを作っている > 留学生がフロー制御が失敗しているせいではないかと思って質問 > してきたのです。 前の記事の質問は、TCP の枠組みをはみだしてますよね。 本来アプリケーションが気にしなくてよい『はず』の領域ですから。 ソケットで自分が使うバッファサイズを設定することはできます。 int size; setsockopt(fd, SOL_SOCLET, SO_RCVBUF, &size, sizeof(size)) ただし、リモートホストのバッファの残りを知ることはできません。 問い合わせて知ったとしても、そのときにはすでに残りバッファ量 は変わっているでしょうし、、、、 > 以上のお話を聞く限り、エラーはread,writeのところで出ている > ような気がするので、今 ソケットに対する write は、注意が必要です。 n=write(fd, ptr, length); ディスクファイルなどでは、 n==length or -1 だと思ってよいので すが、fd がソケットだと 10KB 書こうとして 8KB しか書けないと かいう事態が起こります。 普通なら if((n=write(fd,ptr,length))<0) error,,, で済むところを、 ソケットに書き込むときには、 { int rest=length; int n; char *p; for(p=ptr,rest=length;rest>0;) { if((n=write(fd,p,rest))<0) break; p+=n; rest -= n; } } if(n<0) error,,,, と書かないとだめです。 それから read() も同様で、 n=read(fd,ptr,length) として、 n