クライアント/サーバー

11. 今、実行中のクライアントの IPアドレスを知るには ?

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