UNIXネットワークプログラミング——顧客/サーバープログラム設計模範(一)

2054 ワード

以下に、お客様プログラムがサーバプログラムの各バリエーションをテストするために使用されます.
#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個の接続が同時に存在します.