エコーサーバの改良①
これからエコーサーバのプログラムにちょくちょく改良を加えていきます。以前のソースコードでは、一度でもクライアントが書き込むと、強制的にプログラムが修正します。そこでクライアントは何度書き込んでも、エコーサーバから応答が返ってくるように改良します。
こうしたちょっとした改造の際に、Makefileがあるとすごく便利です。以前の古いファイルの消去もコンパイルも一発で終わります♪
ソースコード
//echo_main.cのファイル #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/uio.h> #include <unistd.h> #include <sys/param.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/select.h> int echo_main(int sock){ char buf[32]; int n; memset(buf, 0, sizeof(buf)); while( n = read(sock, buf, sizeof(buf)) != -1){ write(sock, buf, strlen(buf)); } return 0; }
解説
クライアントからの入力を無限ループで受け付けるように改良しました。最初どこを修正すべきなのが迷ったのですが、いろいろなところをいじった結果、
n = read(sock, buf, sizeof(buf)
この行を無限ループで囲むと良いようです。コード的には、
scanf("%s",str);
を無限ループで囲ったものとと基本的に同じ流れになります。
両者の違いは、読み込み元がネットワークを介するか否かだけです。よって修正箇所としては、read関数しかないのは自明でした。
今後の改良項目
・並列処理
・エラー処理
・無停止
・ログ出力