
[ このメッセージへの返事 ]
[ 返事を書く ]
[ 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月ほどまえネットワークプログラミングについて教えて
# いただきありがとうございました。
# >あさはらたくじさん
# せっかくソースを送ってもらったのですが、残念ながら
# コンパイルできませんでした。

|