エコーサーバの改良①

 これからエコーサーバのプログラムにちょくちょく改良を加えていきます。以前のソースコードでは、一度でもクライアントが書き込むと、強制的にプログラムが修正します。そこでクライアントは何度書き込んでも、エコーサーバから応答が返ってくるように改良します。
 こうしたちょっとした改造の際に、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関数しかないのは自明でした。

今後の改良項目

・並列処理
・エラー処理
・無停止
・ログ出力