サービスを要求する場合、クライアントプログラムは、サーバーに接続して要求を送信し、ミーティングメッセージを待ちます。メッセージの受信前に接続が閉じられる場合、その機密ラベルではミーティングがないため、クライアントは終了します。メッセージが受信されると、クライアントは 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);
}