Trusted Solaris 開発ガイド

TCP/IP クライアント

サービスを要求する場合、クライアントプログラムは、サーバーに接続して要求を送信し、ミーティングメッセージを待ちます。メッセージの受信前に接続が閉じられる場合、その機密ラベルではミーティングがないため、クライアントは終了します。メッセージが受信されると、クライアントは t6recvfrom(3N) を使用してメッセージと情報ラベルを取得します。情報を処理するコードは、この例には示されていません。

プログラムのこの最初の部分は、クライアント要求とサーバー応答のデータ構造を設定します。

#include <stdio.h>
 #include <sys/types.h>
 #include <fcntl.h>
 #include <sys/socket.h>
 #include <string.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <tsol/label.h>
 #include <tsix/t6attrs.h>

 char *clnt_req = "Request Meeting Info";

 main(int argc, char **argv)
 {
 	int sock, retval;
 	char buf[256];
 	int buflen = 256;
 	int num;
 	struct sockaddr_in serv_addr;
 	struct hostent *hostent;
 	bilabel_t *bil;
 	t6mask_t new_mask, il_mask = T6M_IL;
 	t6attr_t handle;
 	char    *string = (char *)0;

主プログラムの次のセグメントは、コマンド行の argcargv 入力を処理し、サーバーのホスト名とポート番号を取得し、接続を確立します。

	if (argc != 2) {
 		printf("Usage: %s host¥n", argv[0]);
 		exit (1);
 	}
 	if ((hostent = gethostbyname(argv[1])) == NULL) {
 		perror("gethostbyname");
 		exit(1);
 	}

 	memset((void *) &serv_addr, 0, sizeof (serv_addr));
 	serv_addr.sin_family = AF_INET;
 	serv_addr.sin_port = htons(10000);
 	memcpy((void *) &serv_addr.sin_addr,
 		(void *) hostent->h_addr_list[0], hostent->h_length);

 	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
 		perror("socket");
 		exit(1);
 	}
 	if (connect(sock, (struct sockaddr *)&serv_addr,
 		sizeof (serv_addr)) < 0) {
 		perror("connect");
 		exit(1);
 	}
 	printf("Connected¥n");
 	if ((handle = t6alloc_blk(il_mask)) == NULL) {
 		printf("t6attr_alloc: no memory");
 		exit(1);
 	}

主プログラムの次のセグメントは、要求をサーバーに送信します。この要求は、クライアントプロセスが動作している機密ラベルで送信されます。サーバーは、この要求を処理するとき、要求が作成された機密ラベルのミーティング情報のみを返送します。t6recvfrom(3N) ルーチンは、ミーティング情報を受信します。t6get_attr(3N) ルーチンは、サーバープロセスが応答に付けた情報ラベルを取得します。

/* サーバーに要求を送る */
 	write(sock, clnt_req, strlen(clnt_req));

 	if ((num = t6recvfrom(sock, buf, buflen, 0, 0, 0, handle,
 		&new_mask)) < 0) {
 		perror("t6recvfrom");
 		exit (1);
 	} else if (num == 0) {
 		printf("Connection closed, nothing matches.¥n");
 		exit(0);
 	} else
 		printf("Received Reply¥n");

/* msg に付けられた情報ラベルを取得する */
 	if ((bil = (bilabel_t *) t6get_attr(T6_IL,
 		handle)) == NULL) {
 		printf("t6get_attr: no IL available");
 		exit(0);
 	}

 	retval = biltos(bil, &string, 0, LONG_WORDS);
 	printf("Retval = %d, Information label = %s¥n", retval, string);
 	printf("Message = %s¥n", buf);
 }