今、5250エミュレータでTCP/IP接続しているPCクライアントの
IPアドレスを調べる方法を紹介する。
C言語によるTCP/IP通信プログラムであれば getpeername() 関数などで
簡単に取得できるのだが 5250エミュレータの中で簡単に
クライアントの IPアドレスを知る方法はないだろうか ?
API : QDCRDEVD を使えば簡単に知ることができる。
【サンプルCLP : TESTCLTIP】
0001.00 PGM
0002.00 /*---------------------------------------------------------*/
0003.00 /* TESTCLT: クライアント・チエック */
0004.00 /*---------------------------------------------------------*/
0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0006.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0007.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0008.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0009.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0010.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0011.00 DCL VAR(&DEVINFO) TYPE(*CHAR) LEN(1121)
0012.00 DCL VAR(&VARLEN) TYPE(*DEC) LEN(4 0) VALUE(1121)
0013.00 DCL VAR(&DEVNAM) 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(&IPADDR) TYPE(*CHAR) LEN(15)
0019.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0020.00
0021.00 RTVJOBA JOB(&DEVNAM) TYPE(&TYPE)
0022.00 CALL PGM(QDCRDEVD) PARM(&DEVINFO &VARLEN +
0023.00 'DEVD0600' &DEVNAM &APIERR)
0024.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)
0025.00 SNDPGMMSG +
0026.00 MSG('API: QUHDSPH の実行で次のエラーが発生 +
0027.00 しました。 ') MSGTYPE(*DIAG)
0028.00 GOTO APIERR
0029.00 ENDDO
0030.00 CHGVAR VAR(&IPADDR) VALUE(%SST(&DEVINFO 877 15))
0031.00 SNDPGMMSG MSG(' このクライアントは ' *TCAT &IPADDR +
0032.00 *TCAT ' です。 ') MSGTYPE(*DIAG)
0033.00 RETURN
0034.00
0035.00
0036.00 APIERR:
0037.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0038.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0039.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0040.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0041.00 GOTO SNDMSG
0042.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)
0043.00 SNDMSG:
0044.00 IF COND(&TYPE *EQ '0') THEN(DO)
0045.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP
0046.00 ENDDO
0047.00 ELSE CMD(DO)
0048.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG
0049.00 ENDDO
0050.00 ENDPGM
【解説】
API : QDCRDEVD に JOB名、すなわち装置名を指定して実行して戻される装置情報(&DEVINFO)の
877桁目から 15桁がIPアドレスである。
