今、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アドレスである。