TCP/IP での PING
コマンドは単に TCP/IP 通信が可能であるか、どうかを検査するものであり
Telnet サーバーや Ftpサーバー、Httpサーバーが起動しているかどうかを検査するものではない。
ここで紹介する 「TCP/IP サーバーの活動検査 ( CHKSVR
)」 コマンドは Well-Known サーバー、
つまり一般的な TCP/IP サーバーが活動中かどうかを検査するものである。
例えば、
PGM CHKSVR PORT(*HTTP) MONMSG MSGID(CPF9800) EXEC(DO) SNDPGMMSG MSG('HTTP サーバーは活動していません。 ') ENDDO ENDPGM
のような処理が可能である。
この CHKSVR
コマンドはコマンド CHKSVR
, CLP : CHKSVRCL
と C/400: PORTCHK
の3つから構成されている。
----------------------------------------------------------------------------------- 0001.00 CMD PROMPT(' サーバー活動検査 ') 0002.00 PARM KWD(PORT) TYPE(*CHAR) LEN(15) RSTD(*YES) + 0003.00 DFT(*HTTP) VALUES(*FTP *SSH *TELNET *SMTP + 0004.00 *HTTP *ALASKA *EXCLSVR *AUTOGUI *SPOOLWTR + 0005.00 *PHP *POP3 *IMAP *LDAP *SSL *DRDA *DDM + 0006.00 *DDMSSL *RUNRMTCMD *LPD *IMPLICIT + 0007.00 *SSLTELNET *IBMHTTPADM *IBMSSLHTPADM + 0008.00 *HPJETDIRECT) SPCVAL((*FTP 21) (*SSH 22) + 0009.00 (*TELNET 23) (*SMTP 25) (*HTTP 80) + 0010.00 (*ALASKA 3009) (*EXCLSVR 3005) (*AUTOGUI + 0011.00 3006) (*SPOOLWTR 3007) (*PHP 89) (*POP3 + 0012.00 110) (*IMAP 143) (*LDAP 389) (*SSL 443) + 0013.00 (*DRDA 446) (*DDM 447) (*DDMSSL 448) + 0014.00 (*RUNRMTCMD 512) (*LPD 515) (*IMPLICIT + 0015.00 990) (*TELNETSSL 992) (*IBMHTTPADM 2001) + 0016.00 (*IBMSSLHTPADM 2010) (*HPJETDIRECT 9100)) + 0017.00 PROMPT('TCP/IP サーバー ') -----------------------------------------------------------------------------------
このコマンド CHKSVR
は PORT の入力値として *HTTP
, *FTP
, ... 等の文字列をパラメータとして
入力するのであるが実際に CLP: CHKSVRCL
に渡される値は 80
, 21
, ... のように PORT 番号に
変換されて渡されるようになっている。
コンパイルは、
CRTCMD MYLIB/CHKSVR PGM(MYLIB/CHKSVRCL) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)
--------------------------------------------------------------------------------- 0001.00 PGM PARM(&SERVER) 0002.00 /*---------------------------------------------------------*/ 0003.00 /* CHKSVRCL : サーバー活動検査 */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0006.00 DCL VAR(&SERVER) TYPE(*CHAR) LEN(15) 0007.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0008.00 DCL VAR(&PORT) TYPE(*CHAR) LEN(4) 0009.00 DCL VAR(&RES) TYPE(*CHAR) LEN(4) 0010.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0011.00 0012.00 RTVJOBA TYPE(&TYPE) 0013.00 CHGVAR VAR(&PORT) VALUE(%SST(&SERVER 1 4)) 0014.00 CALL PGM(ASNET.COM/PORTCHK) PARM(&PORT &RES) 0015.00 IF COND(&RES *NE 'TRUE') THEN(DO) 0016.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA('PORT = + 0017.00 ' *CAT &PORT *TCAT + 0018.00 ' は活動していません。 ') MSGTYPE(*ESCAPE) 0019.00 ENDDO 0020.00 RETURN 0021.00 0022.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) 0023.00 SNDMSG: 024.00 IF COND(&TYPE *EQ '0') THEN(DO) 025.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP) 026.00 ENDDO 027.00 ELSE CMD(DO) 028.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG) 029.00 ENDDO 030.00 ENDPGM ----------------------------------------------------------------------------------
CLP: CHKSVRCL
ではコマンド CHKSVR
から受け取ったPORT番号をプログラム PORTCHK
に渡して
結果を受け取るだけである。
コンパイルは、
CRTCLPGM PGM(MYLIB/CHKSVRCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
-------------------------------------------------------------------------------------- 0001.00 /********************************************************************/ 0002.00 /* */ 0003.00 /* PORTCHK : PORT 検査 */ 0004.00 /* */ 0005.00 /* Office Quattro Co,.Ltd 2005/9/16 10:44:20 created */ 0006.00 /* */ 0007.00 /********************************************************************/ 0008.00 #include <stdio.h> 0009.00 #include <stdlib.h> 0010.00 #include <string.h> 0011.00 #include <netdb.h> 0012.00 #include <sys/types.h> 0013.00 #include <sys/socket.h> 0014.00 #include <netinet/in.h> 0015.00 #include <netinet/tcp.h> 0016.00 #include <arpa/inet.h> 0017.00 0018.00 #define TRUE 0 0019.00 #define FALSE -1 0020.00 #define SERV_HOST_ADDR "127.0.0.1" 0021.00 #define MAXPORT 1024 0022.00 #define BUFLEN 1024 0023.00 #define SBUFLEN 256 0024.00 0025.00 /***********************/ 0026.00 /* 関数の定義 */ 0027.00 /***********************/ 0028.00 0029.00 /********************************************************************/ 0030.00 /* m a i n --- main module of this pgm */ 0031.00 /*------------------------------------------------------------------*/ 0032.00 /* Parameter : 1. PORT[4] */ 0033.00 /* 2. RESULT[4] */ 0034.00 /* */ 0035.00 /********************************************************************/ 0036.00 void main(int argc, char *argv[]){ 0037.00 struct sockaddr_in addr; 0038.00 struct servent *sent; 0039.00 int fd, i, j, rtn, n; 0040.00 char buf[BUFLEN]; 0041.00 int PORT; 0042.00 char result[6]; 0043.00 0044.00 /*[ パラメータの取得 ]*/ 0045.00 PORT = atoi(argv[1]); 0046.00 /* ソケットの準備 */ 0047.00 fd = socket(AF_INET, SOCK_STREAM, 0); 0048.00 memset((char*)&addr, 0, sizeof(addr)); 0049.00 addr.sin_family = AF_INET; 0050.00 addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR); 0051.00 addr.sin_port = htons((short)PORT); 0052.00 0053.00 memset(result, 0, sizeof(result)); 0054.00 /* サーバーと接続 */ 0055.00 if((rtn = connect(fd, (struct sockaddr *)&addr, sizeof(addr))) == -1){ 0056.00 memcpy(result, "FALSE", 5); 0057.00 } 0058.00 else memcpy(result, "TRUE ", 5); 0059.00 close(fd); 0060.00 memcpy(argv[2], result, 5); 0061.00 exit(0); 0062.00 0063.00 } --------------------------------------------------------------------------------------
プログラム : PORTCHK
は サーバーとして 127.0.0.1 と指定PORT番号を使ってアクセスして
通信可能かどうかを検査している。
127.0.0.1 とは自分自身を指している IPアドレスであり、すべての TCP/IP サーバーで共通である。
PORTCHK プログラムは 製品 EnterpriseServer の HTTPサーバーの開始(STRHTPSVR)
コマンドの
初期プログラムの中で利用されている。
HTTPサーバーの開始(STRHTPSVR)
をユーザーが起動すると、まず PORTCHK によって
PORT = 80
が未使用で空いているかどうかが検査される。
PORT = 80
が空いていれば STRHTPSVR は開始PORT を 80 として開始するが、使用中であれば
PORT = 3009
で STRHTPSVR コマンドを開始する。
このように PORT の検査に利用されている。