サービスを要求する場合、クライアントプログラムは、サーバーに接続して要求を送信し、ミーティングメッセージを待ちます。メッセージの受信前に接続が閉じられる場合、その機密ラベルではミーティングがないため、クライアントは終了します。メッセージが受信されると、クライアントは 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;
主プログラムの次のセグメントは、コマンド行の argc と argv 入力を処理し、サーバーのホスト名とポート番号を取得し、接続を確立します。
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); }