応用プログラミング ex5 演習課題

  • コメント付きソースファイル
    • &ref{echoServer_wc.c};
    • &ref{handleTCPClient_wc.c};
  • 次の各ポイントで、echoServer の状態を表示するように echoServer.c および、handleTCPClient.c を変更しなさい。その際、各ポイントで echoServer の実行を1秒づつ休止しなさい。
  1. サーバポートの確定後
  2. 着信ソケット作成後
  3. 着信ソケットのバインド後
  4. 着信ソケットを接続待機状態(Listen)に設定後
  5. クライアントから着信接続を待機する前
  6. クライアントから着信接続を受け入れ後
  7. クライアントからデータ受信後
  8. クライアントへデータ送信後
  9. サーバ接続切断後
  • プログラムを途中で休止するためには、unistd.h で定義されている関数 sleep() を利用しなさい。
  • クライアントから送られてくる文字列には、終端文字 '\0' が付いていません。そのため、受信データ(文字列)を printf() の文字列(%s)書式などでそのまま表示しようとするとうまく表示されません。handleTCPClient.c のように受信データの長さを使って %c で表示するなどの工夫が必要です。送信時についても同様です。
  • 出力されたはずの状態表示がすぐには表示されない場合があります。これは、表示速度などの効率化のために、ある程度まとまったサイズになるまで実際の表示出力を貯めておくしくみ(バッファ)があるためです。表示がすぐになされない場合は、stdio.h で定義されている

fflush(stdout); }} という、貯まっているバッファを強制的に吐き出す(表示させる)関数を printf() などの直後に挿入してみてください。

  • サーバのIPアドレスは INADDR_ANY で自動取得するため、状態表示で表示する必要はありません。以下の例では、関数 char *inet_ntoa(struct in_addr in) を利用しています。

printf(“*Bind to %s:%u\n”, inet_ntoa(echoServAddr.sin_addr),… }}

  • 実行結果の一例を示す。
[sano@s1542f160 ~]$ ./echoServer 5007
*Server Port: 5007                     <- ポート番号表示して、1秒休止
*Socket Ready                          <- ソケット作成して、1秒休止
*Bind to 0.0.0.0:5007                  <- ソケットをバインドして、1秒休止(サーバIPは INADDR_ANY で自動で取得させるため 0.0.0.0 と表示される)
*Server socket to be Listen            <- ソケットを待機状態にして、1秒休止
*Waiting Client connection.            <- クライアントからの接続を待つ
*Accept Client connection.             <- クライアントから1度目の接続を受け取って、1秒休止
Handling client 127.0.0.1              <- クライアントIP表示(元からの出力)
*Received Data: 1st connection         <- 受信したデータを表示(元からの出力)、1秒休止
*Sent Data: 1st connection             <- 送信したデータを表示、1秒休止
*Received Data: 12345
*Sent Data: 12345
*Received Data: .........*.........*.........*..   <- 受信バッファサイズを超えたデータ(50バイト)は2回に分けて受信/送信している(初回、32バイト)
*Sent Data: .........*.........*.........*..
*Received Data: .......*.........*                 <-(二回目、残り18バイト)
*Sent Data: .......*.........*
*Received Data:
*Close Connection                                 <- クライアントの接続が切れた
*Waiting Client connection.                       <- 次のクライアントからの接続を待つ
*Accept Client connection.                        <- 2回目の接続を受け取った
Handling client 127.0.0.1
*Received Data: 2nd Connection
*Sent Data: 2nd Connection
*Received Data: 
*Close Connection                                 <- 2回目の接続を終了して
*Waiting Client connection.                       <- 次の接続を待つ
  • %必要に応じてプログラムソースを参照しながら、実行結果を TA に説明しなさい。%
  • echoServer のクライアントへの返信を1文字(1byte)ずつ行うように変更しなさい。その際、1文字返信するごとにechoServerのプログラム実行を1秒間休止しなさい。
  • 演習課題 1.で行った送信データの表示についても、1秒毎の送信に合わせて1文字ずつ表示すること。
  • クライアントからの受信データ方法は変更せずにまとめて受信し、表示もまとめて表示します。
  • echoClient.c を変更する必要はありません。ただし、echoClient 側でも1文字ずつの受信を確認したい場合には、echoClient.c で毎回の受信時の受信文字列表示後に fflush(stdout); を追加します。
  • %変更した箇所を説明しながら、実行結果を TA に示しなさい。%
  • lecture/apro/2016/ex5.txt
  • 最終更新: 2019/09/23 13:50
  • by sano