Netcompo アプリケーション会話サービス 2.1 LU0会話サービス編 - Solaris -
|
目次
索引

|
付録A アプリケーションプログラム例
A.2 非同期型アプリケーションの例
/*====================================================================*
* アプリケーションプログラム例 2 *
* *
* (1) main : メイン処理(非同期型) *
* (2) comprcv : 完了受信処理 *
* (3) procend : プロセス終了処理 *
* *
*====================================================================*/
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <memory.h>
#include <signal.h>
#include <fcntl.h>
#include <stropts.h>
#include <poll.h>
#include "lu0.h"
/*---------------------------------------------*/
/* 外部参照モジュール */
/*---------------------------------------------*/
/*============= 出口関数 ====================*/
extern void rcvalrm(); /* タイマ用 */
extern void rcvsig(); /* ユーザ・シグナル用 */
extern void rcvend(); /* プログラム終了用 */
/*---------------------------------------------*/
/* エントリモジュール */
/*---------------------------------------------*/
void main();
int comprcv();
void procend();
/*---------------------------------------------*/
/* ローカル定義 */
/*---------------------------------------------*/
#define NORMAL 0 /* マクロ命令復帰値正常 */
/*====================================================================*
* function name : (1) main *
* function : メイン処理(非同期型) *
*====================================================================*/
void
main()
{
struct sigaction act; /* sigaction用パラメタ */
struct lu0rb rcb; /* rcb */
struct lu0rb *rcbp; /* rcbポインタ */
char *wbufp; /* 送信バッファポインタ */
char *rbufp; /* 受信バッファポインタ */
int rcvdfd; /* 受信用パイプfd退避域 */
int rtnc; /* 復帰値 */
int dc; /* */
/*=============================================*/
/* タイマ出口関数登録 */
/*=============================================*/
act.sa_handler = rcvalrm; /*
*((int *)(&act.sa_mask)) = SIGALRM; /* アラーム・クロック */
act.sa_flags = NULL; /* */
sigaction( SIGALRM, &act, NULL ); /* */
/*=============================================*/
/* シグナル出口関数登録 */
/*=============================================*/
signal( SIGUSR1, rcvsig ); /* ユーザ・シグナル1 */
signal( SIGUSR2, rcvsig ); /* ユーザ・シグナル2 */
signal( SIGTERM, rcvend ); /* 終了シグナル */
signal( SIGBUS, rcvend ); /* バスエラー */
signal( SIGQUIT, rcvend ); /* 中止 */
signal( SIGHUP, rcvend ); /* ハングアップ */
signal( SIGINT, rcvend ); /* 割込み */
signal( SIGSEGV, rcvend ); /* セグメントエラー */
rcbp = &rcb; /* rcbアドレス設定 */
memset( rcbp, 0, sizeof(struct lu0rb) ); /* rcb域クリア */
/*=============================================*/
/* lu0open マクロ処理 */
/* <<< アプリ登録 >>> */
/*=============================================*/
strcpy( rcbp->l_unit, "lu01" ); /* LU名設定 */
if( lu0open1( rcbp ) != NORMAL ) /* lu0open1正常? */
{ /* */
return; /* no -> < 異常終了 > */
} /* */
rcvdfd = rcbp->l_pipfd; /* 受信用パイプfd退避 */
/*=============================================*/
/* lu0getbマクロ処理 */
/* <<< 送信バッファ獲得 >>> */
/*=============================================*/
rcbp->l_bfsiz = 12288; /* 獲得サイズ設定 (12K) */
if( lu0getb( rcbp ) != NORMAL ) /* lu0getb正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
/*=============================================*/
/* lu0getbマクロ処理 */
/* <<< 受信バッファ獲得 >>> */
/*=============================================*/
wbufp = rcbp->l_bufadr; /* バッファアドレス退避 */
rcbp->l_bfsiz = 12288; /* 獲得サイズ設定 (12K) */
if( lu0getb( rcbp ) != NORMAL ) /* lu0getb正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
rbufp = rcbp->l_bufadr; /* バッファアドレス退避 */
/*=============================================*/
/* lu0cnctマクロ処理 */
/* <<< セション確立 >>> */
/*=============================================*/
rcbp->l_mode = LU0CACC; /* ホスト主導型 */
rcbp->l_cpltmd = LU0ASYN; /* 非同期型完了 */
rcbp->l_rbfp = rbufp; /* 受信バッファアドレス */
rcbp->l_amode = CTLCD; /* 送信権獲得制御あり */
rcbp->l_cmd1 = SSCPNTC; /* SSCPデータ通知有 */
rcbp->l_cmd2 = RESPRQT1; /* タイプ1応答要求 */
rcbp->l_aplmx = 12288; /* 最大利用者データ長12K*/
if( lu0cnct( rcbp ) != NORMAL ) /* lu0cnct正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
rtnc = comprcv( rcbp ); /* 完了受信待ち合わせ */
if( rtnc != 0 ) /* 完了受信正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
if( rcbp->l_cplt != ELU0OK ) /* lu0cnct正常完了? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
/*=============================================*/
/* lu0checkマクロ処理 */
/* <<< 受信状態の問い合わせ >>> */
/*=============================================*/
if( lu0check( rcbp ) != NORMAL ) /* lu0check正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
rcbp->l_time = 60; /* タイマ値設定 */
if( rcbp->l_cplt == ELU0RCV ) /* 受信データあり ? */
{ /* */
rcbp->l_time = 0; /* yes -> タイマ値再設定*/
} /* */
/*=============================================*/
/* lu0readマクロ処理 */
/* <<< データ受信 >>> */
/*=============================================*/
rcbp->l_cpltmd = LU0ASYN; /* 非同期型完了 */
rcbp->l_rbfp = rbufp; /* */
if( lu0read( rcbp ) != NORMAL ) /* lu0read正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
rtnc = comprcv( rcbp ); /* 完了受信待ち合わせ */
if( rtnc != 0 ) /* 完了受信正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
/* */
if( rcbp->l_cplt != ELU0OK ) /* lu0read正常完了? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
/*=============================================*/
/* lu0writeマクロ処理 */
/* <<< データ送信 >>> */
/*=============================================*/
rcbp->l_cpltmd = LU0ASYN; /* 非同期型完了 */
rcbp->l_wcmd = L_DATA; /* データ送信指定 */
rcbp->l_wrmd1 = CD; /* 送信権獲得制御あり */
rcbp->l_wlng = 512; /* 送信データ長設定 */
rcbp->l_wbfp = wbufp; /* */
for( dc = 0 ; dc < 512 ; dc++ , wbufp++) /* A */
{ /* | 送信データ設定 */
*wbufp = 0x31; /* V */
} /* */
if( lu0write( rcbp ) != NORMAL ) /* lu0write正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
rtnc = comprcv( rcbp ); /* 完了受信待ち合わせ */
if( rtnc != 0 ) /* 完了受信正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
/* */
if( rcbp->l_cplt != ELU0OK ) /* lu0write正常完了? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
/*=============================================*/
/* lu0discマクロ処理 */
/* <<< セション解放 >>> */
/*=============================================*/
rcbp->l_cpltmd = LU0ASYN; /* 非同期型完了 */
if( lu0disc( rcbp ) != NORMAL ) /* lu0disc 正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
rtnc = comprcv( rcbp ); /* 完了受信待ち合わせ */
if( rtnc != 0 ) /* 完了受信正常? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
/* */
if( rcbp->l_cplt != ELU0OK ) /* lu0disc 正常完了? */
{ /* */
procend( rcbp ); /* no ---> 終了処理 */
return; /* < 異常終了 > */
} /* */
/*=============================================*/
/* lu0frebマクロ処理 */
/* <<< 送信バッファ解放 >>> */
/*=============================================*/
rcbp->l_bufadr = wbufp; /*
lu0freb( rcbp ); /* lu0freb発行 */
/*=============================================*/
/* lu0frebマクロ処理 */
/* <<< 受信バッファ解放 >>> */
/*=============================================*/
rcbp->l_bufadr = rbufp; /*
lu0freb( rcbp ); /* lu0freb発行 */
/*=============================================*/
/* lu0closeマクロ処理 */
/* <<< アプリ登録抹消 >>> */
/*=============================================*/
lu0close( rcbp ); /* lu0close発行 */
/* */
return; /* < 正常終了 > */
} /* */
/*====================================================================*
* function name : (2) comprcv *
* function : 完了受信処理 *
*====================================================================*/
int
comprcv( rcbp )
struct lu0rb *rcbp;
{ /* */
struct pollfd pfd; /* */
int event; /* */
pfd.fd = rcbp->l_pipfd; /* 受信用パイプfd設定 */
pfd.events = POLLIN; /* */
pfd.revents = 0; /* */
event = poll( &pfd, 1, 30000 ); /* 事象待ち合わせ */
/* */
lu0rcv( rcbp ); /* */
/* */
switch( rcbp->l_cmcode ) /* */
{ /* */
case LU0CNCT : return(0); /* */
/* */
case LU0DISC : return(0); /* */
/* */
case LU0READ : return(0); /* */
/* */
case LU0WRITE : return(0); /* */
/* */
case 0 : return(-1); /* */
/* */
default : return(-1); /* */
} /* */
} /* */
/*====================================================================*
* function name : (3) procend *
* function : プロセス終了処理 *
*====================================================================*/
void
procend( rcbp )
struct lu0rb *rcbp;
{ /* */
/*=============================================*/
/* lu0closeマクロ処理 */
/* <<< アプリ登録抹消 >>> */
/*=============================================*/
lu0close( rcbp ); /* lu0close発行 */
/* */
return; /* */
} /* */
All Rights Reserved, Copyright (C) 富士通株式会社 2002