UNIXネットワークプログラミング——顧客/サーバープログラム設計模範(一)
2054 ワード
以下に、お客様プログラムがサーバプログラムの各バリエーションをテストするために使用されます.
13-15本クライアントプログラムを実行するたびに、サーバのホスト名またはIPアドレス、サーバのポート番号、クライアントforkのサブプロセス数(クライアントが同時に同じサーバに複数の接続を開始する)、各サブプロセスがサーバに送信する要求数、および各要求サーバに返信するデータバイト数を指定します.
22-38親プロセスはforkを呼び出して指定された数のサブプロセスを派生させ、各サブプロセスはサーバと指定された数の接続を確立する.接続が確立されるたびに、サブプロセスは、接続上でサーバにテキストを1行送信し、サーバから何バイトのデータを返信する必要があるかを示し、その接続にこの数のデータを読み込んで、接続を閉じます.親プロセスはwaitを呼び出してすべてのサブプロセスが終了するのを待つだけです.なお、ここで各TCP接続をオフにするのはクライアントであるため、TCP TIME_WAIT状態はサーバ側ではなくクライアント側で発生する.これは通常のHTTP接続との違いの一つである.
各バージョンのサーバ・プログラムをテストするときに、お客様のプログラムを実行するコマンドは次のとおりです.
#include "unp.h"
#define MAXN 16384 /* max # bytes to request from server */
int
main(int argc, char **argv)
{
int i, j, fd, nchildren, nloops, nbytes;
pid_t pid;
ssize_t n;
char request[MAXLINE], reply[MAXN];
if (argc != 6)
err_quit("usage: client <hostname or IPaddr> <port> <#children> "
"<#loops/child> <#bytes/request>");
nchildren = atoi(argv[3]);
nloops = atoi(argv[4]);
nbytes = atoi(argv[5]);
snprintf(request, sizeof(request), "%d
", nbytes); /* newline at end */
for (i = 0; i < nchildren; i++) {
if ( (pid = Fork()) == 0) { /* child */
for (j = 0; j < nloops; j++) {
fd = Tcp_connect(argv[1], argv[2]);
Write(fd, request, strlen(request));
if ( (n = Readn(fd, reply, nbytes)) != nbytes)
err_quit("server returned %d bytes", n);
Close(fd); /* TIME_WAIT on client, not server */
}
printf("child %d done
", i);
exit(0);
}
/* parent loops around to fork() again */
}
while (wait(NULL) > 0) /* now parent waits for all children */
;
if (errno != ECHILD)
err_sys("wait error");
exit(0);
}
13-15本クライアントプログラムを実行するたびに、サーバのホスト名またはIPアドレス、サーバのポート番号、クライアントforkのサブプロセス数(クライアントが同時に同じサーバに複数の接続を開始する)、各サブプロセスがサーバに送信する要求数、および各要求サーバに返信するデータバイト数を指定します.
22-38親プロセスはforkを呼び出して指定された数のサブプロセスを派生させ、各サブプロセスはサーバと指定された数の接続を確立する.接続が確立されるたびに、サブプロセスは、接続上でサーバにテキストを1行送信し、サーバから何バイトのデータを返信する必要があるかを示し、その接続にこの数のデータを読み込んで、接続を閉じます.親プロセスはwaitを呼び出してすべてのサブプロセスが終了するのを待つだけです.なお、ここで各TCP接続をオフにするのはクライアントであるため、TCP TIME_WAIT状態はサーバ側ではなくクライアント側で発生する.これは通常のHTTP接続との違いの一つである.
各バージョンのサーバ・プログラムをテストするときに、お客様のプログラムを実行するコマンドは次のとおりです.
#client 206.62.226.36 8888 5 500 4000
これにより、サーバとのTCP接続が2500個確立される:5つのサブプロセスは、それぞれ500回の接続を開始する.各接続において、クライアントはサーバに5バイトのデータ(「4000」)を送信し、サーバはクライアントに4000バイトのデータを返信する.本クライアントプログラムは、2つの異なるホスト上で同じサーバに対して実行され、合計5000個のTCP接続が提供され、任意の時点でサーバ側に最大10個の接続が同時に存在します.