CL

93. PCクライアントの IPアドレスを取得するには ?

実行中のクライアント PC の IP アドレスは API: QDCRDEVD を使って
簡単に取り出すことができる。
次はそのサンプル・ソースである。

【TESTDEVD:サンプルCLPソース】
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 アドレスを取得することができるようになる。