C/400

32. PORTが使用されているかどうか検査するには?

TCP/IPサーバー・デーモンを作成していると、PORTの使用有無を検査したい場合がある。
通常は、PORTの使用を検査できないものと考えられがちであるが、
実はこれを可能にする方法がある。
以下にそのソースを紹介する。
これは実際に EnterpriseServer で使用されているソースである。

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))) ==
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 }