home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tcpipvp2.zip / SOCKET.PAS < prev    next >
Pascal/Delphi Source File  |  1996-10-10  |  13KB  |  357 lines

  1. unit SOCKET;
  2.  
  3. interface
  4.  
  5. uses OS2Def,
  6.      IBMSO32,IBMTCP32;
  7.  
  8.  
  9.  
  10.   const
  11.     InAddr_Any     =  0;
  12.     SockAddr_Len   = 16;
  13.     In_Addr_Len    =  4;
  14.  
  15.     AF_UNSPEC      =  0;
  16.     AF_UNIX        =  1;
  17.     AF_INET        =  2;
  18.     AF_IMPLINK     =  3;
  19.     AF_PUP         =  4;
  20.     AF_CHAOS       =  5;
  21.     AF_NS          =  6;
  22.     AF_NBS         =  7;
  23.     AF_ECMA        =  8;
  24.     AF_DATAKIT     =  9;
  25.     AF_CCITT       = 10;
  26.     AF_SNA         = 11;
  27.     AF_MAX         = 17;
  28.  
  29.     SOCK_NULL      =  0;
  30.     SOCK_STREAM    =  1;
  31.     SOCK_DGRAM     =  2;
  32.     SOCK_RAW       =  3;
  33.     SOCK_RDM       =  4;
  34.     SOCK_SEQPACKET =  5;
  35.  
  36.     IPPROTO_NULL   =  0;
  37.     IPPROTO_UP     =  1;
  38.     IPPROTO_TCP    =  2;
  39.  
  40.     FIONBIO        =  1;
  41.  
  42.   type
  43.     In_Addr_Ptr    = ^In_Addr;
  44.     In_Addr        = record
  45.                        case integer of
  46.                          0: (IPAddr:   ULong);
  47.                          1: (ClassA:   byte;
  48.                              ClassB:   byte;
  49.                              ClassC:   byte;
  50.                              ClassD:   byte)
  51.                      end;
  52.     SockAddr_In_Ptr= ^SockAddr_In;
  53.     SockAddr_In    = record
  54.                        case integer of
  55.                          0: (Sa_Family:  word;
  56.                              Sa_Addr:    array[1..14] of byte);
  57.                          1: (Sin_Family: word;
  58.                              Sin_Port:   word;
  59.                              Sin_Addr:   In_Addr;
  60.                              Sin_Zero:   array[1.. 8] of byte);
  61.                      end;
  62.     HostEnt_Ptr   = ^HostEnt;
  63.     HostEnt       = record
  64.                       H_Name:      ^string;
  65.                       H_Alias:     pointer;
  66.                       H_AddrType:  longint;
  67.                       H_Length:    longint;
  68.                       H_Addr_List: ^In_Addr_Ptr;
  69.                     end;
  70.  
  71.   (****************************************************************************)
  72.    function SockAccept(SockHandle:  ULong;
  73.                        SockAddr:    SockAddr_In_Ptr;
  74.                        SockAddrLen: ULong): ApiRet;
  75.   (****************************************************************************)
  76.    function SockBind(SockHandle:  ULong;
  77.                      SockAddr:    SockAddr_In_Ptr;
  78.                      SockAddrLen: ULong): ApiRet;
  79.   (****************************************************************************)
  80.    function SockConnect(SockHandle:  ULong;
  81.                         SockAddr:    SockAddr_In_Ptr;
  82.                         SockAddrLen: ULong): ApiRet;
  83.   (****************************************************************************)
  84.    function SockShutdown(SockHandle:  ULong;
  85.                         SockFlags:   ULong): ApiRet;
  86.   (****************************************************************************)
  87.    function SockGetHostID: ULong;
  88.   (****************************************************************************)
  89.    function SockGetSockname(SockHandle: ULong): string;
  90.   (****************************************************************************)
  91.    function SockSetBlockingIO(SockHandle: ULong;
  92.                               BlockingIO: boolean): ApiRet;
  93.   (****************************************************************************)
  94.    function SockListen(SockHandle: ULong;
  95.                        SockQueue:  ULong): ApiRet;
  96.   (****************************************************************************)
  97.    function SockRecv(SockHandle: ULong;
  98.                      SockBuffer: pointer;
  99.                      SockBufLen: ULong;
  100.                      SockFlags:  ULong): ApiRet;
  101.   (****************************************************************************)
  102.    function SockSend(SockHandle: ULong;
  103.                      SockBuffer: pointer;
  104.                      SockBufLen: ULong;
  105.                      SockFlags:  ULong): ApiRet;
  106.   (****************************************************************************)
  107.    function SockSocket(SockFamily:   word;
  108.                        SockType:     word;
  109.                        SockProtocol: word): ApiRet;
  110.   (****************************************************************************)
  111.    function SockClose(SockHandle: ULong): ApiRet;
  112.   (****************************************************************************)
  113.    function SockErrNo: ApiRet;
  114.   (****************************************************************************)
  115.    function SockInit: ApiRet;
  116.   (****************************************************************************)
  117.    function SockGetHostAddrByName(HostName: string): ULong;
  118.   (****************************************************************************)
  119.    function SockGetHostNameByAddr(HostAddr: In_Addr_Ptr): string;
  120.   (****************************************************************************)
  121.    function SockGetHostname: string;
  122.   (****************************************************************************)
  123.    function htonl(Input: longint): longint;
  124.   (****************************************************************************)
  125.    function htons(Input: word): word;
  126.   (****************************************************************************)
  127.  
  128. implementation
  129.  
  130.   const
  131.     Version    = '0.90';
  132.     UseString:  string = '@(#)socket interface unit for IBM TCP/IP'+#0;
  133.     CopyRight1: string = '@(#)socket Version '+Version+' - 10.10.96'+#0;
  134.     CopyRight2: string = '@(#)(C) Chr.Hohmann BfS ST2.2 1996'+#0;
  135.  
  136.   (****************************************************************************)
  137.   function htonl(Input: longint): longint;
  138.   type
  139.     SwapLong = record
  140.                  case integer of
  141.                    0: (SLong:  longint);
  142.                    1: (SArray: array[1..4] of byte);
  143.                end;
  144.   var
  145.     Inp,Tmp: SwapLong;
  146.   begin
  147.     Inp.SLong     := Input;
  148.     Tmp.SArray[1] := Inp.SArray[4];
  149.     Tmp.SArray[2] := Inp.SArray[3];
  150.     Tmp.SArray[3] := Inp.SArray[2];
  151.     Tmp.SArray[4] := Inp.SArray[1];
  152.     htonl         := Tmp.SLong;
  153.   end;
  154.   (****************************************************************************)
  155.   function htons(Input: word): word;
  156.   type
  157.     SwapWord = record
  158.                  case integer of
  159.                    0: (SWord:  word);
  160.                    1: (SArray: array[1..2] of byte);
  161.                end;
  162.   var
  163.     Inp,Tmp: SwapWord;
  164.   begin
  165.     Inp.SWord     := Input;
  166.     Tmp.SArray[1] := Inp.SArray[2];
  167.     Tmp.SArray[2] := Inp.SArray[1];
  168.     htons         := Tmp.SWord;
  169.   end;
  170.   (****************************************************************************)
  171.   function SockAccept(SockHandle:  ULong;
  172.                       SockAddr:    SockAddr_In_Ptr;
  173.                       SockAddrLen: ULong): ApiRet;
  174.   begin
  175.     SockAccept := IBM_accept(SockHandle,
  176.                              SockAddr,
  177.                              @SockAddrLen);
  178.   end;
  179.   (****************************************************************************)
  180.   function SockBind(SockHandle:  ULong;
  181.                     SockAddr:    SockAddr_In_Ptr;
  182.                     SockAddrLen: ULong): ApiRet;
  183.   begin
  184.     SockBind := IBM_bind(SockHandle,
  185.                          SockAddr,
  186.                          SockAddrLen);
  187.   end;
  188.   (****************************************************************************)
  189.   function SockConnect(SockHandle:  ULong;
  190.                        SockAddr:    SockAddr_In_Ptr;
  191.                        SockAddrLen: ULong): ApiRet;
  192.   begin
  193.     SockConnect := IBM_connect(SockHandle,
  194.                                SockAddr,
  195.                                SockAddrLen);
  196.   end;
  197.   (****************************************************************************)
  198.   function SockShutdown(SockHandle:  ULong;
  199.                         SockFlags:   ULong): ApiRet;
  200.   begin
  201.     SockShutdown := IBM_shutdown(SockHandle,
  202.                                  SockFlags);
  203.   end;
  204.  
  205.   (****************************************************************************)
  206.   function SockGetHostID: ULong;
  207.   begin
  208.     SockGetHostID := htonl(IBM_gethostid);
  209.   end;
  210.   (****************************************************************************)
  211.   function SockGetSockname(SockHandle: ULong): string;
  212.   var
  213.     rc,
  214.     SLength: longint;
  215.     SName:   string;
  216.   begin
  217.     fillchar(SName,sizeof(SName),#0);
  218.     SLength := 254;
  219.     rc := IBM_getsockname(SockHandle,@SName[1],@SLength);
  220.     if (rc <> -1) then
  221.       SName[0] := char(SLength)
  222.     else
  223.       SName := '';
  224.     SockGetSockname := SName;
  225.   end;
  226.   (****************************************************************************)
  227.   function SockSetBlockingIO(SockHandle: ULong;
  228.                              BlockingIO: boolean): ApiRet;
  229.   var
  230.     Arg: ULong;
  231.   begin
  232.     if BlockingIO then
  233.       Arg := 0
  234.     else
  235.       Arg := 1;
  236.     SockSetBlockingIO := IBM_ioctl(SockHandle,FIONBIO,@Arg);
  237.   end;
  238.   (****************************************************************************)
  239.   function SockListen(SockHandle: ULong;
  240.                       SockQueue:  ULong): ApiRet;
  241.   begin
  242.     SockListen := IBM_listen(SockHandle,SockQueue);
  243.   end;
  244.   (****************************************************************************)
  245.   function SockRecv(SockHandle: ULong;
  246.                     SockBuffer: pointer;
  247.                     SockBufLen: ULong;
  248.                     SockFlags:  ULong): ApiRet;
  249.   begin
  250.     SockRecv := IBM_recv(SockHandle,
  251.                          SockBuffer,
  252.                          SockBufLen,
  253.                          SockFlags);
  254.   end;
  255.   (****************************************************************************)
  256.   function SockSend(SockHandle: ULong;
  257.                     SockBuffer: pointer;
  258.                     SockBufLen: ULong;
  259.                     SockFlags:  ULong): ApiRet;
  260.   begin
  261.     SockSend := IBM_send(SockHandle,
  262.                          SockBuffer,
  263.                          SockBufLen,
  264.                          SockFlags);
  265.   end;
  266.   (****************************************************************************)
  267.   function SockSocket(SockFamily:   word;
  268.                       SockType:     word;
  269.                       SockProtocol: word): ApiRet;
  270.   begin
  271.     SockSocket := IBM_socket(SockFamily,
  272.                              SockType,
  273.                              SockProtocol);
  274.   end;
  275.   (****************************************************************************)
  276.   function SockClose(SockHandle: ULong): ApiRet;
  277.   begin
  278.     SockClose := IBM_soclose(SockHandle);
  279.   end;
  280.   (****************************************************************************)
  281.   function SockErrNo: ApiRet;
  282.   begin
  283.     SockErrNo := IBM_Sock_ErrNo;
  284.   end;
  285.   (****************************************************************************)
  286.   function SockInit: ApiRet;
  287.   begin
  288.     SockInit := IBM_Sock_Init;
  289.   end;
  290.   (****************************************************************************)
  291.   function SockGetHostByName(Hostname: string): pointer;
  292.   begin
  293.     HostName          := HostName+#0;
  294.     SockGetHostByName := IBM_gethostbyname(@HostName[1]);
  295.   end;
  296.   (****************************************************************************)
  297.   function SockGetHostAddrByName(HostName: string): ULong;
  298.   var
  299.     rc:     Hostent_Ptr;
  300.     InAddr: In_Addr;
  301.   begin
  302.     rc := SockGetHostByName(Hostname);
  303.     if (ULong(rc) <> 0) then begin
  304.       InAddr := rc^.H_Addr_List^^;
  305.     end else InAddr.IPAddr := 0;
  306.     SockGetHostAddrByName := InAddr.IPAddr;
  307.   end;
  308.   (****************************************************************************)
  309.   function SockGetHostByAddr(HostAddr:     In_Addr_Ptr;
  310.                              HostAddrLen:  ULong;
  311.                              HostAddrType: ULong): pointer;
  312.   begin
  313.     SockGetHostByAddr := IBM_gethostbyaddr(HostAddr,
  314.                                            HostAddrLen,
  315.                                            HostAddrType);
  316.   end;
  317.   (****************************************************************************)
  318.   function SockGetHostNameByAddr(HostAddr: In_Addr_Ptr): string;
  319.   var
  320.     I:     integer;
  321.     rc:    Hostent_Ptr;
  322.     HName: string;
  323.   begin
  324.     rc := SockGetHostByAddr(HostAddr,
  325.                             In_Addr_Len,
  326.                             AF_INET);
  327.     if (ULong(rc) <> 0) then begin
  328.       HName := '';
  329.       I     := 0;
  330.       while rc^.H_Name^[I] <> #0 do begin
  331.         HName := HName+rc^.H_Name^[I];
  332.         inc(I);
  333.       end;
  334.     end else HName := 'hostname not found';
  335.     SockGetHostNameByAddr := HName;
  336.   end;
  337.   (****************************************************************************)
  338.   function SockGetHostname: string;
  339.   var
  340.     I,
  341.     SResult:  longint;
  342.     HostName: string;
  343.   begin
  344.     fillchar(HostName,sizeof(HostName),#0);
  345.     SResult := IBM_gethostname(@HostName[1],sizeof(HostName));
  346.     I := 1;
  347.     while (I < sizeof(HostName)) and (Hostname[I] <> #0) do inc(I);
  348.     if (I > 1) then
  349.       HostName[0] := char(I)
  350.     else
  351.       HostName    := 'amnesiac';
  352.     SockGetHostname := HostName;
  353.   end;
  354.   (****************************************************************************)
  355.  
  356. end.
  357.