Netcompo アプリケーション会話サービス 2.1 LU6.2会話サービス編 - Solaris -
|
目次
索引
|
付録B サンプルプログラム
以下に、LU6.2会話サービスを使用するためのプログラム例を"図:Verbインタフェースを使用したプログラム例"に示します。
/**********************************************************************
* sample.c
* Solaris LU6.2会話サービス 2.0
* VERBライブラリ用 サンプルプログラム(ファイル転送)
*
* [ 使い方]
* コマンド ユニークセション名 自ローカルLU名
*
* 作成日:1995 年12月 5日
**********************************************************************/
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <lu62verb.h>
#define MAX_DATA_LEN 4096 /* 最大ファイルレコード長 */
main(argc, argv)
int argc;
char *argv[];
{
int debug_flag; /* DEBUG processing flag */
int name_length; /* Argument name length */
char name_char; /* Argument name character */
int name_flag; /* Argument name defined flag */
char snd_fname[128]; /* Send file name */
FILE *snd_fd; /* Send file stream pointer */
/* 自ローカルLU名 */
char local_lu_name[MAX_LU_NAME+1];
/* ユニークセション名 */
char uniq_sess_name[MAX_UNIQUE_SESS_NAME+1];
int end_flag; /* 会話終了フラグ */
int err_flag; /* 会話異常発生フラグ */
u_long lu_id; /* LU識別子 */
u_long conversation_id; /* 会話識別子 */
u_long listen_id; /* listen識別子 */
u_long return_code; /* LU6. 2 バーブ復帰値 */
int length; /* ユーザデータTEXT長 */
int send_length; /* 送信データ長 */
int request_length; /* 受信バッファサイズ */
int received_length; /* 受信データ長通知域 */
u_char snd_buf[MAX_DATA_LEN]; /* 送信データTEXTバッファ */
u_char rcv_buf[MAX_DATA_LEN]; /* 受信データTEXTバッファ */
u_char rcv_data_type; /* 受信データタイプ */
u_char rcv_flag_type; /* 受信フラグタイプ */
int i, j; /* ループカウンタ */
int snd_count; /* 送信データカウンタ */
int rcv_count; /* 受信データカウンタ */
int conv_id[2]; /* 会話識別子表示ワ−ク域 */
int buff_size; /* 受信バッファサイズ */
int key_flag; /* 送受信指示キー入力迂回フラグ */
char keyin[128]; /* 送受信指示キー入力域 */
union { /* バーブパラメタブロック共用体 */
APPC_OPEN appc_open_p; /* appc_open バーブ */
MC_ALLOCATE mc_allocate_p; /* mc_allocate バーブ */
APPC_LISTEN appc_listen_p; /* appc_listen バーブ */
APPC_ACCEPT appc_accept_p; /* appc_accept バーブ */
MC_CONFIRM mc_confirm_p; /* mc_confirm バーブ */
MC_CONFIRMED mc_confirmed_p; /* mc_confirmed バーブ */
MC_SEND_DATA mc_send_data_p; /* mc_send_data バーブ */
/* mc_receive_and_waitバーブ */
MC_RECEIVE_AND_WAIT mc_receive_and_wait_p;
/* mc_request_to_send バーブ */
MC_REQUEST_TO_SEND mc_request_to_send_p;
MC_DEALLOCATE mc_deallocate_p; /* mc_deallocate バーブ */
APPC_CLOSE appc_close_p; /* appc_close バーブ */
} parm;
extern char *convert_retcode(u_long);
/*******************************************************************
* コマンドパラメタの解析
*******************************************************************/
setbuf(stderr, 0); /* print文即時出力の設定 */
name_flag = 0; /* 名前パラメタ検出フラグ初期化 */
debug_flag = 0; /* デバッグフラグ初期化 */
if(argc < 3) {
fprintf(stderr,
"Usage: %s unique_session_name local_lu_name\n", argv[0]);
exit(1);
}
for(i=1; i<argc; i++) {
if(argv[i][0] == '-') {
switch(argv[i][1]) {
case 'd': /* デバッグ文表示指示 */
debug_flag = 1;
break;
case 'h': /* コマンド使用法表示指示 */
fprintf(stderr,
"Usage: %s unique_session_name local_lu_name [-d] \n",
argv[0]);
fprintf(stderr,
" unique_session_name : "
"Unique session name in LU6.2 setup \n");
fprintf(stderr,
" local_lu_name : "
"Local LU name in VCPE setup\n");
fprintf(stderr,
" -d : set debugging mode\n");
exit(1);
default: /* その他のフラグ−>エラー */
fprintf(stderr,
"Usage: %s unique_session_name local_lu_name [-d] \n",
argv[0]);
exit(1);
}
} else if(name_flag == 0) {
/* Unique-session-name パラメタの解析 */
if( (name_length = strlen(argv[i])) == 0 ) {
fprintf(stderr, "Unique_session_name length 0 \n");
exit(1);
}
if(name_length > MAX_UNIQUE_SESS_NAME) {
fprintf(stderr, "Unique_session_name length over %d \n",
MAX_UNIQUE_SESS_NAME);
exit(1);
}
for(j=0; j<name_length; j++) {
name_char = (unsigned int)argv[i][j];
if((isalnum(name_char) == 0) &&
(isspecial(name_char) == 0)) {
fprintf(stderr, "Unique_session_name contains a "
"invalid character( \'%c \':0x%.2x) \n",
name_char, name_char);
exit(1);
}
}
strcpy(uniq_sess_name, argv[i]);
name_flag++;
} else { /* Local-LU-nameパラメタの解析 */
if( (name_length = strlen(argv[i])) == 0 ) {
fprintf(stderr, "Local_LU_name length 0 \n");
exit(1);
}
if(name_length > MAX_LU_NAME) {
fprintf(stderr, "Local_LU_name length over %d \n", MAX_LU_NAME);
exit(1);
}
for(j=0; j<name_length; j++) {
name_char = (unsigned int)argv[i][j];
if(isalnum(name_char) == 0) {
fprintf(stderr, "Local_LU_name contains a "
"invalid character( \'%c \':0x%.2x) \n",
name_char, name_char);
exit(1);
}
}
strcpy(local_lu_name,argv[i]);
name_flag++;
}
} /*** Parameter analyze while loop end ***************************/
if(name_flag != 2) {
fprintf(stderr, "Usage: %s sym_dest_name local_lu_name\n", argv[0]);
exit(1);
}
if(debug_flag != 0) {
printf("DBG: local_lu_name = %s \n", local_lu_name);
printf("DBG: unique_session_name = %s \n", uniq_sess_name);
printf("DBG: debugging mode = %d \n", debug_flag);
}
/*******************************************************************
* 送信ファイルのオープン
*******************************************************************/
while(1) {
fprintf(stderr, "Key-in send file name :");
if(scanf("%s", snd_fname) != 1) {
fprintf(stderr, "Key-in error.\n");
continue;
}
if(strncmp(snd_fname, "/e", 2) == 0) {
fprintf(stderr, "File transfer end. \n");
exit(0);
}
if ((snd_fd = fopen(snd_fname,"r")) == (FILE *)0) {
fprintf(stderr, "Fopen error(file=%s, errno=%d) \n",
snd_fname, errno);
continue;
} else {
break;
}
}
/*******************************************************************
* ローカルLU名の設定(appc_openバーブ呼び出し)
*******************************************************************/
return_code = OK;
if(debug_flag != 0) {
printf("DBG: Call appc_open()\n");
}
memset(&parm.appc_open_p, NULL, sizeof(APPC_OPEN));
strcpy(parm.appc_open_p.local_lu_name, local_lu_name);
return_code = appc_open(&parm.appc_open_p);
if(return_code != OK) {
printf("appc_open execution failure(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
exit(-1);
}
lu_id = parm.appc_open_p.lu_id;
if(debug_flag != 0) {
printf("DBG: appc_open() completed.(rtn=%d) \n",return_code);
}
/*******************************************************************
* 会話の開始(mc_allocateバーブ呼び出し)
*******************************************************************/
if(debug_flag != 0) {
printf("DBG: Call mc_allocate()\n");
}
memset(&parm.mc_allocate_p, NULL, sizeof(MC_ALLOCATE));
parm.mc_allocate_p.lu_id = lu_id;
strcpy(parm.mc_allocate_p.unique_session_name, uniq_sess_name);
parm.mc_allocate_p.tp_name_is_iso = CODE_IS_ASCII;
strncpy(parm.mc_allocate_p.tp_name, "SAMPLE", MAX_TP_NAME);
parm.mc_allocate_p.type = WHEN_SESSION_ALLOCATED;
parm.mc_allocate_p.sync_level = SYNC_CONFIRM;
return_code = mc_allocate(&parm.mc_allocate_p);
if(return_code != OK) {
printf("mc_allocate execution failure(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
exit(-1);
}
conversation_id = parm.mc_allocate_p.conv_id;
if(debug_flag != 0) {
printf("DBG: mc_allocate() completed.(rtn=%d) \n",return_code);
}
/*******************************************************************
* ファイルレコードの送受信繰り返し処理
*******************************************************************/
snd_count = 1;
rcv_count = 1;
err_flag = 0;
end_flag = 0;
rcv_data_type = rcv_flag_type = WR_NONE;
key_flag = 1;
while(1) {
/*=============================================================*
* 送受信続行/停止 キー入力処理
* [PC停止要求 有無判定]
*=============================================================*/
while(key_flag) {
fprintf(stderr,
"Send & receive data ? ['y'/'n'(=quit)/'l'(=loop)] :");
if(scanf("%s",keyin) != 1) {
fprintf(stderr, "Key-in error.\n");
continue;
}
if((keyin[0] == 'n') || (keyin[0] == 'N') ||
(keyin[0] == 'q') || (keyin[0] == 'Q')) {
fprintf(stderr, "File transfer end. \n");
end_flag = 1;
break;
}
else if((keyin[0] == 'y') || (keyin[0] == 'Y'))
break;
else if((keyin[0] == 'l') || (keyin[0] == 'L'))
key_flag = 0;
else
continue;
}
if(end_flag == 1) {
/*---------------------------------------------*/
/* 会話終了送信処理 */
/* (mc_deallocateバーブ呼び出し)*/
/*---------------------------------------------*/
if(debug_flag != 0) {
printf("DBG: Call mc_deallocate()\n");
}
memset(&parm.mc_deallocate_p, NULL, sizeof(MC_DEALLOCATE));
parm.mc_deallocate_p.conv_id = conversation_id;
if(err_flag == 1) {
if((return_code == DEALLOCATE_ABEND) ||
(return_code == DEALLOCATE_NORMAL)) {
parm.mc_deallocate_p.type = SUB_LOCAL;
} else {
parm.mc_deallocate_p.type = SUB_ABEND;
}
} else {
if(rcv_flag_type == WR_CONFIRM_DEALLOCATE) {
parm.mc_deallocate_p.type = SUB_LOCAL;
} else {
parm.mc_deallocate_p.type = SUB_CONFIRM;
}
}
return_code = mc_deallocate(&parm.mc_deallocate_p);
if(return_code != OK) {
printf("mc_deallocate execution failure"
"(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
err_flag = 1;
break;
}
if(debug_flag != 0) {
printf("DBG: mc_deallocate() completed.(rtn=%d) \n",return_code);
}
break;
}
/*=============================================================*
* データ送信・送信確認処理
*=============================================================*/
/*---------------------------------------*/
/* ファイルレコード(TEXT)の読込み */
/* [PIPE] */
/*---------------------------------------*/
if((length = fread(snd_buf, 1, MAX_DATA_LEN, snd_fd)) == 0) {
if(feof(snd_fd) != 0) {
fclose( snd_fd );
end_flag = 1;
continue;
} else {
printf("Fread error(file=%s,errno=%d) \n", snd_fname, errno);
err_flag = 1;
end_flag = 1;
continue;
}
}
if(debug_flag != 0) {
printf("DBG: Fread() completed.(length=%d)\n", length);
}
/*-------------------------------------------*/
/* データ送信 */
/* (mc_send_dataバーブ呼び出し)*/
/*-------------------------------------------*/
if(debug_flag != 0) {
printf("DBG: Call mc_send_data()\n");
}
memset(&parm.mc_send_data_p, NULL, sizeof(MC_SEND_DATA));
parm.mc_send_data_p.conv_id = conversation_id;
parm.mc_send_data_p.type = SUB_NONE;
parm.mc_send_data_p.nbio = BLOCKING;
parm.mc_send_data_p.length = length;
parm.mc_send_data_p.data = snd_buf;
return_code = mc_send_data(&parm.mc_send_data_p);
if(return_code != OK) {
printf("mc_send_data execution failure(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
err_flag = 1;
end_flag = 1;
continue;
}
if(debug_flag != 0) {
printf("DBG: mc_send_data() completed.(rtn=%d) \n", return_code);
printf("DBG: request_to_send_received=%d \n",
parm.mc_send_data_p.request_to_send_received);
}
/*-----------------------------------------------*/
/* 送信確認(mc_confirmバーブ呼び出し)*/
/*-----------------------------------------------*/
if(debug_flag != 0) {
printf("DBG: Call mc_confirm() \n");
}
memset(&parm.mc_confirm_p, NULL, sizeof(MC_CONFIRM));
parm.mc_confirm_p.conv_id = conversation_id;
return_code = mc_confirm(&parm.mc_confirm_p);
if(return_code != OK) {
printf("mc_confirm execution failure(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
err_flag = 1;
end_flag = 1;
continue;
}
if(debug_flag != 0) {
printf("DBG: mc_confirm() completed.(rtn=%d)\n", return_code);
printf("DBG: request_to_send received=%d\n",
parm.mc_confirm_p.request_to_send_received);
}
/*=============================================================*
* データ受信・確認応答の送信処理
* または,会話終了受信処理
*=============================================================*/
while(1) {
/*------------------------------------------------------*/
/* データ受信処理 */
/* (mc_receive_and_waitバーブ呼び出し)*/
/* データ・送信確認・会話終了のいずれかを受信 */
/*------------------------------------------------------*/
if(debug_flag != 0) {
printf("DBG: Call mc_receive_and_wait()\n");
}
memset(&parm.mc_receive_and_wait_p,
NULL, sizeof(MC_RECEIVE_AND_WAIT));
parm.mc_receive_and_wait_p.conv_id = conversation_id;
parm.mc_receive_and_wait_p.type = SUB_NONE;
parm.mc_receive_and_wait_p.length = MAX_DATA_LEN;
parm.mc_receive_and_wait_p.data = rcv_buf;
return_code = mc_receive_and_wait(&parm.mc_receive_and_wait_p);
if(return_code != OK) {
printf("mc_receive_and_wait execution failure"
"(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
err_flag = 1;
end_flag = 1;
break;
}
rcv_data_type = parm.mc_receive_and_wait_p.what_received_data_type;
rcv_flag_type = parm.mc_receive_and_wait_p.what_received_flag_type;
if(debug_flag != 0) {
printf("DBG: mc_receive_and_wait() completed.(rtn=%d) \n",
return_code);
printf("DBG: received data type=%d\n", rcv_data_type);
printf("DBG: received length =%d\n",
parm.mc_receive_and_wait_p.length);
printf("DBG: received flag type=%d\n", rcv_flag_type);
printf("DBG: request_to_send received=%d\n",
parm.mc_receive_and_wait_p.request_to_send_received);
}
/*---------------------------*/
/* データ受信時の処理 */
/*---------------------------*/
if(rcv_data_type != WR_NONE) {
/*+++++++++++++++++++++++++++++++++++++++*/
/* 受信データ(TEXT)をファイルへ格納*/
/* [PIPE] */
/*+++++++++++++++++++++++++++++++++++++++*/
/* NOP */
}
/*--------------------------------*/
/* 送信確認受信・確認応答送信処理 */
/*--------------------------------*/
if((rcv_flag_type == WR_CONFIRM) ||
(rcv_flag_type == WR_CONFIRM_SEND) ||
(rcv_flag_type == WR_CONFIRM_DEALLOCATE)) {
/*+++++++++++++++++++++++++++++++++++++++++++*/
/* 確認応答送信 */
/* (mc_confirmedバーブ呼び出し)*/
/*+++++++++++++++++++++++++++++++++++++++++++*/
if(debug_flag != 0) {
printf("DBG: Call mc_confirmed() \n");
}
memset(&parm.mc_confirmed_p, NULL, sizeof(MC_CONFIRMED));
parm.mc_confirmed_p.conv_id = conversation_id;
return_code = mc_confirmed(&parm.mc_confirmed_p);
if(return_code != OK) {
printf("mc_confirmed execution failure"
"(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
err_flag = 1;
end_flag = 1;
break;
}
if(debug_flag != 0) {
printf("DBG: mc_confirmed() completed.(rtn=%d)\n",
return_code);
}
}
/*---------------------------*/
/* 送信権受信時の処理 */
/* −>データ送信処理へ戻る*/
/*---------------------------*/
if((rcv_flag_type == WR_SEND) ||
(rcv_flag_type == WR_CONFIRM_SEND)) {
end_flag = 0;
break;
}
/*--------------------------------*/
/* 会話終了受信時の処理 */
/*--------------------------------*/
if(rcv_flag_type == WR_CONFIRM_DEALLOCATE) {
end_flag = 1;
break;
}
/*--------------------------------------*/
/* 送信確認処理終了・送信権要求送信処理 */
/*--------------------------------------*/
if(rcv_flag_type == WR_CONFIRM) {
/*++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/* 送信権要求送信 */
/* (MC_REQUEST_TO_SENDバーブ呼び出し)*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++*/
if(debug_flag != 0) {
printf("DBG: Call mc_request_to_send()\n");
}
memset(&parm.mc_request_to_send_p,
NULL, sizeof(MC_REQUEST_TO_SEND));
parm.mc_request_to_send_p.conv_id = conversation_id;
return_code = mc_request_to_send(&parm.mc_request_to_send_p);
if(return_code != OK) {
printf("mc_request_to_send execution failure"
"(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
err_flag = 1;
end_flag = 1;
break;
}
if(debug_flag != 0) {
printf("DBG: mc_request_to_send() completed.(rtn=%d) \n",
return_code);
}
}
} /*** Receive while loop end *********************************/
} /*** Send & Receive while loop end *****************************/
/*******************************************************************
* LU資源の解放(appc_closeバーブ呼び出し)
*******************************************************************/
if(debug_flag != 0) {
printf("DBG: Call appc_close() \n");
}
memset(&parm.appc_close_p, NULL, sizeof(APPC_CLOSE));
parm.appc_close_p.lu_id = lu_id;
return_code = appc_close(&parm.appc_close_p);
if(return_code != OK) {
printf("appc_close execution failure(return_code:%d:\'%s \')\n",
return_code, convert_retcode(return_code));
err_flag = 1;
}
if(debug_flag != 0) {
printf("DBG: appc_close() completed.(rtn=%d)\n", return_code);
}
/*******************************************************************
* プログラム終了処理
*******************************************************************/
fclose(snd_fd);
printf("File Transfer normal end. \n");
printf("Program stoped. \n");
exit(0);
}
/***********************************************************************
* isspecial : Check a character as special characters
**********************************************************************/
int isspecial(c)
int c;
{
static
char special[] = {'.', '<', '(', '+', '&', '*', ')', ';', ' `', '/',
',', '%', '_', '>', '?', ':', '=', '"', ' \''};
int i;
for(i=0; i<19; i++)
{
if( c == (unsigned int)special[i])
return(1); /* isspecial() TRUE */
}
return(0); /* isspecial() FLASE */
}
#define MAX_RET 40
/***********************************************************************
* convert_retcode : Convert return_code to a symbolic character
**********************************************************************/
char *convert_retcode(return_code)
u_long return_code;
{
int i;
static struct return_symbol {
char strings[64];
u_long ret_value;
} RET_SYMBOL[] = {
{"OK", 0x00000000},
{"ALLOCATION_FAILURE_NO_RETRY", 0x00040003 },
{"ALLOCATION_FAILURE_CONV_MISM", 0x00040009 },
{"ALLOCATION_FAILURE_SYNC_LEV", 0x0004000A },
{"ALLOCATION_FAILURE_SESSION_LIMIT", 0x0004000E},
{"PROG_ERROR_NO_TRUNC", 0x00050001 },
{"PROG_ERROR_TRUNC", 0x00050002},
{"PROG_ERROR_PURGING", 0x00050003},
{"INVALID_SUB_VERB_TYPE", 0x00070001},
{"DEALLOCATE_ABEND", 0x00080001},
{"DEALLOCATE_NORMAL", 0x00080005},
{"PARAMETER_ERROR", 0x000A0000 },
{"BAD_LU_NAME", 0x000A0003},
{"BAD_CONV_ID", 0x000A0008},
{"INVALID_CONV_TYPE", 0x000A0020},
{"SYNC_LEVEL_NOT_SUPPORTED_BY_CONV", 0x000A0032 },
{"BAD_MODE_NAME", 0x000A0101},
{"BAD_TP_NAME", 0x000A0102},
{"RESOURCE_FAILURE_NO_RETRY", 0x000E0001 },
{"STATE_CHECK_BAD_STATE", 0x00100001 },
{"UNSUCCESSFUL_RETRY", 0x00110001},
{"FD_FAILURE", 0x00FF0001},
{"SHM_FAILURE", 0x00FF0003 },
{"SESSION_DEACTIVATED", 0x00FF0005 },
{"RTR_RECEIVED", 0x00FF0006 },
{"LU62_DEACTIVATE", 0x00FF0007},
{"INCONSISTENCY_IN_LU62", 0x00FF0008},
{"SYSTEM_ERROR_NO_RETRY", 0x00FF0009 },
{"WAIT_UNTIL_RTR", 0x00FF000A},
{"VCP_ERROR_NO_RETRY", 0x00FF000C},
{"VCP_DEACTIVATE", 0x00FF000D },
{"ENVIRONMENT_ERROR_NO_RETRY", 0x00FF000F},
{"<< Undefined Error >>", 0xFFFFFFFF}
};
for(i = 0; RET_SYMBOL[i].ret_value != 0xFFFFFFFF; i++) {
if(return_code == RET_SYMBOL[i].ret_value) {
break;
}
}
return(RET_SYMBOL[i].strings);
}
All Rights Reserved, Copyright (C) 富士通株式会社 2002