現在C言語でソケットプログラミングを学んでいて、selectコールを利用したTCPサーバーとTCPクライントを実装しています。
サーバプロセスが終了するとき、FINパケットをクライアントに送信して、「Server is down.」等のメッセージを表示 して終了するようにクライアントを改良したいのですが、どのようにすればよいのでしょうか??
recv()でFINパケットを受け取ればよいのでしょうか??
ちなみにクライント側のプログラムは以下のようになっています
c
1void tcp_client(char* servername, int port_number) 2{ 3 int sock; 4 char s_buf[S_BUFSIZE], r_buf[R_BUFSIZE]; 5 int strsize; 6 fd_set mask, readfds; 7 8 /* サーバに接続する */ 9 // 自作ライブラリの関数 10 sock = init_tcpclient(servername, port_number); 11 printf("Connected.\n"); 12 13 /* ビットマスクの準備 */ 14 // fd_set型変数maskの初期化 15 FD_ZERO(&mask); 16 // maskの第0番目とsock番目を1にする、ビットが1であれば監視をするという意味 17 FD_SET(0, &mask); 18 FD_SET(sock, &mask); 19 // 標準入力(0番目)と サーバとの接続用に開いたソケット(sock番目)を監視する 20 21 for(;;){ 22 23 /* 受信データの有無をチェック */ 24 // サーバからの入力があるかをselect()で確認する 25 readfds = mask; 26 select(sock+1, &readfds, NULL, NULL, NULL); 27 28 if( FD_ISSET(0, &readfds) ){ 29 // FD_ISSET(0, &readfds)が真であればキーボードから入力があったとわかる→送信 30 31 /* キーボードから文字列を入力する */ 32 fgets(s_buf, S_BUFSIZE, stdin); 33 strsize = strlen(s_buf); 34 Send(sock, s_buf, strsize, 0); 35 // sendにエラー処理を加えた自作関数 36 } 37 38 if( FD_ISSET(sock, &readfds) ){ 39 // FD_ISSET(sock, &readgds)でサーバからパケットが届いているか確認できる→受信 40 41 /* サーバから文字列を受信する */ 42 strsize = Recv(sock, r_buf, R_BUFSIZE-1, 0); 43 r_buf[strsize] = '\0'; 44 printf("%s",r_buf); 45 fflush(stdout); /* バッファの内容を強制的に出力 */ 46 } 47 48 } 49 50}
回答1件
あなたの回答
tips
プレビュー