ソケットを使ったプロセス間通信について



[ このメッセージへの返事 ] [ 返事を書く ] [ home.html ]



投稿者: 68user @ oryo.inforyoma.or.jp on 97/10/17 23:57:58

最近ゲームの話ばっかりで話題に加われないので、
ちょっと自分好みの分野の質問をします。

FreeBSDでソケットを使ってプロセス間通信(と言うので
しょうか?)のプログラムを書きました。すごく初歩的
なもので、クライアントが入力された文字列をサーバに
送り、サーバはその文字列を表示する、というものです。

もうすこし詳しく書くと、クライアントは標準入力から1行
読み込んで、まずその長さを送り、次に読み込んだ文字列を
サーバに送ります。サーバは長さを受け取り、その長さ分
文字列を受け取って表示します。

で、質問なんですが、クライアントが勝手にC-cなどで終了して
しまったことをサーバが検出するためにはどうすればいいので
しょうか?


# socket()、bind()、connect()などはsetup_{server,client}()で
# 行っていますが、今回は省略します。さらに正常に終了するための
# 部分も省略しました。

server.c------------------------------
void main(){
 char hostname[16]="localhost";
 int soc,len;
 char buf[256];

 if ( ( soc = setup_server(hostname,10001) ) == -1 ) exit(1);
 while (1){
  read(soc,&len,sizeof(len));
  printf("server: len=%d\n",len);
  read(soc,buf,len);
  buf[len]='\0';
  printf("server: %s",buf);
 }
 close(soc);
}

client.c-----------------------------
void main(){
 char hostname[16]="localhost";
 int soc,len;
 char buf[256];

 if ( ( soc = setup_client(hostname,10001) ) == -1 ) exit(1);
 while (1){
  fgets(buf,sizeof(buf),stdin);
  len = strlen(buf);
  printf("client: len=%d\n",len);
  write(soc,&len,sizeof(len));
  printf("client: %s",buf);
  write(soc,buf,strlen(buf));
 }
 close(soc);
}
------------------------------------

server.cのread(...)を

 if ( read(soc,&len,sizeof(len)) == -1 ) break;
 if ( read(soc,buf,len) == -1 ) break;

などとしたのですが、うまくいきません。
man readすると、理由はどうあれreadに失敗したときは
-1を返すように読めるのですが…

どのようにすればクライアントが終了したことをサーバが
認識できるでしょうか?

# 1月ほどまえネットワークプログラミングについて教えて
# いただきありがとうございました。

# >あさはらたくじさん
# せっかくソースを送ってもらったのですが、残念ながら
# コンパイルできませんでした。