実行中のクライアント PC の IP アドレスは API: QDCRDEVD を使って
簡単に取り出すことができる。
次はそのサンプル・ソースである。
0001.00 PGM 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* TESTDEVDE : 装置ジョブの取得 CLP */ 0004.00 /* */ 0005.00 /* 2016/03/10 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0008.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0009.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0012.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0013.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0015.00 VALUE(X'000074') /* 2 進数 */ 0016.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0017.00 VALUE(X'00000000') 0018.00 DCL VAR(&DEVD) TYPE(*CHAR) LEN(10) 0019.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(1024) 0020.00 DCL VAR(&RCVLEN) TYPE(*CHAR) LEN(4) + 0021.00 VALUE(X'00000400') 0022.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10) 0023.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10) 0024.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) 0025.00 DCL VAR(&IPADDR) TYPE(*CHAR) LEN(15) 0026.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0027.00 0028.00 RTVJOBA JOB(&DEVD) TYPE(&TYPE) 0029.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0030.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0031.00 ENDDO /* バッチ */ 0032.00 ELSE CMD(DO) /* 対話式 */ 0033.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0034.00 ENDDO /* 対話式 */ 0035.00 0036.00 CALL PGM(QDCRDEVD) PARM(&RCVVAR &RCVLEN + 0037.00 'DEVD0600' &DEVD &APIERR) 0038.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) 0039.00 SNDPGMMSG + 0040.00 MSG('API: QDCRDEVD の実行で次のエラーが発生 + 0041.00 しました。 ') MSGTYPE(*DIAG) 0042.00 GOTO APIERR 0043.00 ENDDO 0044.00 CHGVAR VAR(&IPADDR) VALUE(%SST(&RCVVAR 877 15)) 0045.00 CHGVAR VAR(&JOB) VALUE(%SST(&RCVVAR 893 10)) 0046.00 CHGVAR VAR(&USER) VALUE(%SST(&RCVVAR 903 10)) 0047.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&RCVVAR 913 6)) 0048.00 SNDPGMMSG MSG('JOB=' *CAT &JOB) MSGTYPE(*DIAG) 0049.00 SNDPGMMSG MSG('USER=' *CAT &USER) MSGTYPE(*DIAG) 0050.00 SNDPGMMSG MSG('JOBNBR=' *CAT &JOBNBR) MSGTYPE(*DIAG) 0051.00 SNDPGMMSG MSG('IPADDR=' *CAT &IPADDR) MSGTYPE(*DIAG) 0052.00 RETURN 0053.00 0054.00 APIERR: 0055.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0056.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0057.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0058.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0059.00 GOTO SNDMSG 0060.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0061.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0062.00 MSGFLIB(&MSGFLIB) 0063.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0064.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0065.00 TOMSGQ(&TOPGMQ) MSGTYPE(*ESCAPE) 0066.00 ENDDO 0067.00 ELSE CMD(DO) 0068.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0069.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0070.00 MSGTYPE(*ESCAPE) 0071.00 ENDDO 0072.00 ENDPGM
QDCRDEVD : 装置記述の検索API では
0036.00 CALL PGM(QDCRDEVD) PARM(&RCVVAR &RCVLEN + 0037.00 'DEVD0600' &DEVD &APIERR)
によって &RCVVAR
を取り出すと
0044.00 CHGVAR VAR(&IPADDR) VALUE(%SST(&RCVVAR 877 15)) 0045.00 CHGVAR VAR(&JOB) VALUE(%SST(&RCVVAR 893 10)) 0046.00 CHGVAR VAR(&USER) VALUE(%SST(&RCVVAR 903 10)) 0047.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&RCVVAR 913 6))
のように IPアドレス: &IPADDR
を取り出すことができる。
クライアント PC の IP アドレスを取り出すことができることが重要である理由は
しばしば IBM i サーバー側からクライアント側へ
ファイルを転送したり配布したりする事案が発生するからである。
クライアント側から IBM i サーバー側へデータを取得しにいくのではなく
IBM i サーバー側からクライアント側へデータやスプールなどを
配布したいという話はしばしば聞かれる。
昔はクライアント PC に Ftp サーバーがいないから
不可能であるとしていたが最近ではそうではない。
Windows PC には Ftp や LPD も初めから既に導入されているので、
それらを起動するだけで
IBM i サーバー側からファイルなどを配布することができるのである。
そのときに必要となってくるのがクライアントの IP アドレスである。
このサンプルを使えば必要なクライアントの
IP アドレスを取得することができるようになる。