home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / Finger 1.3.5 / source / TCP Units / UDPStuff.unit < prev   
Encoding:
Text File  |  1992-02-24  |  5.5 KB  |  192 lines  |  [TEXT/PJMM]

  1. unit UDPStuff;
  2.  
  3. { This code is part of the Finger/Fingerd source code, written in THINK Pascal 4 }
  4. { Copyright 1991-1992 Peter N Lewis }
  5. { If you use this code, you must give me credit in your about box and documentation }
  6. { This is part of my TCP library of routines }
  7.  
  8. interface
  9.  
  10.     uses
  11.         TCPTypes;
  12.  
  13.     const
  14.         UDPDefaultBufferSize = 4048;
  15.  
  16.     type
  17.         UDPConnectionRecord = record
  18.                 magic: OSType;    { A magic number to try and avoid problems with released connection IDs. }
  19.                 stream: StreamPtr;
  20.                 outstanding: integer;
  21.             end;
  22.         UDPConnectionPtr = ^UDPConnectionRecord;
  23.  
  24.     function UDPInit: OSErr;
  25.     procedure UDPFinish;
  26.     function UDPCreate (var connection: UDPConnectionPtr; buffer_size: longInt; localport: integer): OSErr;
  27.     function UDPCreateDynamic (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  28.     function UDPRead (connection: UDPConnectionPtr; timeout: integer; var remoteIP: longInt; var remoteport: integer;{}
  29.                                     var datap: ptr; var datalen: integer): OSErr;
  30.     function UDPReturnBuffer (connection: UDPConnectionPtr; datap: ptr): OSErr;
  31.     function UDPDatagramsAvailable (connection: UDPConnectionPtr): integer;
  32.     function UDPWrite (connection: UDPConnectionPtr; remoteIP: longInt; remoteport: integer;{}
  33.                                     datap: ptr; datalen: integer; checksum: boolean): OSErr;
  34.     function UDPRelease (var connection: UDPConnectionPtr): OSErr;
  35.     function UDPMTU (remoteIP: longInt; var mtu: integer): OSErr;
  36.  
  37. implementation
  38.  
  39.     const
  40.         UDPMagic = 'UDPM';
  41.         UDPBad = '????';
  42.  
  43.     var
  44.         driver_refnum: integer;
  45.  
  46.     procedure ZeroCB (var cb: UDPControlBlock; stream: StreamPtr; call: integer);
  47.     { Zero out the control block parameters. }
  48.         var
  49.             i: integer;
  50.             p: longInt;
  51.     begin
  52.         for p := longInt(@cb) to longInt(@cb) + SizeOf(UDPControlBlock) - 1 do
  53.             ptr(p)^ := 0;
  54.         cb.udpStream := stream;
  55.         cb.ioCRefNum := driver_refnum;
  56.         cb.csCode := call;
  57.     end;
  58.  
  59.     function UDPInit: OSErr;
  60.         var
  61.             oe: OSErr;
  62.             i: integer;
  63.     begin
  64.         oe := OpenDriver('.IPP', driver_refnum);
  65.         UDPInit := oe;
  66.     end;
  67.  
  68.     procedure UDPFinish;
  69.     begin
  70.     end;
  71.  
  72.     procedure MyNotify (stream: streamPtr; eventCode: integer; connection: UDPConnectionPtr; icmpMsg: ptr);
  73.     begin
  74.         if eventCode = UDPDataArrival then
  75.             if connection^.magic = UDPMagic then
  76.                 connection^.outstanding := connection^.outstanding + 1;
  77.     end;
  78.  
  79.     function UDPCreateX (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  80.         var
  81.             oe: OSErr;
  82.             cb: UDPControlBlock;
  83.     begin
  84.         if buffer_size = 0 then
  85.             buffer_size := UDPDefaultBufferSize;
  86.         connection := UDPConnectionPtr(NewPtr(SizeOf(UDPConnectionRecord) + buffer_size));
  87.         oe := MemError;
  88.         if connection <> nil then begin
  89.             connection^.magic := UDPMagic;
  90.             ZeroCB(cb, nil, UDPcsCreate);
  91.             cb.create.rcvBuff := ptr(longInt(connection) + SizeOf(UDPConnectionRecord));
  92.             cb.create.rcvBuffLen := buffer_size;
  93.             cb.create.notifyProc := @MyNotify;
  94.             cb.create.userDataPtr := ptr(connection);
  95.             cb.create.localport := localport;
  96.             oe := PBControl(@cb, false);
  97.             localport := cb.create.localport;
  98.             connection^.stream := cb.udpStream;
  99.             connection^.outstanding := 0;
  100.         end;
  101.         UDPCreateX := oe;
  102.     end;
  103.  
  104.     function UDPCreate (var connection: UDPConnectionPtr; buffer_size: longInt; localport: integer): OSErr;
  105.     begin
  106.         UDPCreate := UDPCreateX(connection, buffer_size, localport);
  107.     end;
  108.  
  109.     function UDPCreateDynamic (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  110.     begin
  111.         localport := 0;
  112.         UDPCreateDynamic := UDPCreateX(connection, buffer_size, localport);
  113.     end;
  114.  
  115.     function UDPRead (connection: UDPConnectionPtr; timeout: integer; var remoteIP: longInt; var remoteport: integer;{}
  116.                                     var datap: ptr; var datalen: integer): OSErr;
  117.         var
  118.             oe: OSErr;
  119.             cb: UDPControlBlock;
  120.     begin
  121.         ZeroCB(cb, connection^.stream, UDPcsRead);
  122.         cb.receive.timeout := timeout;
  123.         oe := PBControl(@cb, false);
  124.         if oe = noErr then
  125.             connection^.outstanding := connection^.outstanding - 1;
  126.         remoteIP := cb.receive.remoteIP;
  127.         remoteport := cb.receive.remoteport;
  128.         datap := cb.receive.rcvBuff;
  129.         datalen := cb.receive.rcvBuffLen;
  130.         UDPRead := oe;
  131.     end;
  132.  
  133.     function UDPReturnBuffer (connection: UDPConnectionPtr; datap: ptr): OSErr;
  134.         var
  135.             oe: OSErr;
  136.             cb: UDPControlBlock;
  137.     begin
  138.         ZeroCB(cb, connection^.stream, UDPcsBfrReturn);
  139.         cb.return.rcvBuff := datap;
  140.         oe := PBControl(@cb, false);
  141.         UDPReturnBuffer := oe;
  142.     end;
  143.  
  144.     function UDPDatagramsAvailable (connection: UDPConnectionPtr): integer;
  145.     begin
  146.         UDPDatagramsAvailable := connection^.outstanding;
  147.     end;
  148.  
  149.     function UDPWrite (connection: UDPConnectionPtr; remoteIP: longInt; remoteport: integer;{}
  150.                                     datap: ptr; datalen: integer; checksum: boolean): OSErr;
  151.         var
  152.             oe: OSErr;
  153.             cb: UDPControlBlock;
  154.             wds: wdsType;
  155.     begin
  156.         ZeroCB(cb, connection^.stream, UDPcsWrite);
  157.         cb.send.remoteIP := remoteIP;
  158.         cb.send.remotePort := remoteport;
  159.         wds.size := datalen;
  160.         wds.buffer := datap;
  161.         wds.term := 0;
  162.         cb.send.wds := @wds;
  163.         cb.send.checksum := ord(checksum);
  164.         oe := PBControl(@cb, false);
  165.         UDPWrite := oe;
  166.     end;
  167.  
  168.     function UDPRelease (var connection: UDPConnectionPtr): OSErr;
  169.         var
  170.             oe: OSErr;
  171.             cb: UDPControlBlock;
  172.     begin
  173.         ZeroCB(cb, connection^.stream, UDPcsRelease);
  174.         oe := PBControl(@cb, false);
  175.         connection^.magic := UDPBad;
  176.         DisposPtr(ptr(connection));
  177.         UDPRelease := oe;
  178.     end;
  179.  
  180.     function UDPMTU (remoteIP: longInt; var mtu: integer): OSErr;
  181.         var
  182.             oe: OSErr;
  183.             cb: UDPControlBlock;
  184.     begin
  185.         ZeroCB(cb, nil, UDPcsMaxMTUSize);
  186.         cb.mtu.remoteIP := remoteIP;
  187.         oe := PBControl(@cb, false);
  188.         mtu := cb.mtu.mtuSize;
  189.         UDPMTU := oe;
  190.     end;
  191.  
  192. end.