IOCP扩展方法AcceptEx, DisconnectEx, GetAcceptExSockaddr用法示例

     这篇文章记录了我刚接触IOCP模型时的理解,对于初学者,应该算不错的调试程序,仅有一个400多行代码的dpr文件,可以直接用WriteLn输出信息,前提是会用delphi建立Console Application,当然你也可以很容易的就改成了C控制台程序或是其它语言。附加代码中有详细的注释,如果你已有IOCP经验,那么请不用在此浪费时间,这个示例不适合你。示例仅展示了IOCP中AcceptEx, DisconnectEx, GetAcceptExSockaddr等的用法。在文章最后有推荐的两个连接,对于想深入研究IOCP与TCP的可以去看看,可人感觉值得去看。文中错误或是不合理的地方敬请原谅,如果方便还请指出,深表感谢!

    刚接触IOCP时,因为要弄清里面的复杂关系,最直接的方法当然就是断点调试与信息输出了,所以我选用了控制台程序。具体的原理在文章末尾的第一个连接中讲得很详细,扩展的方法可以到MSDN上查。示例中仅用了一个工作线程和10个连接,个人觉得这样方便调试与查看输出信息,省去了多线程与数据池的干扰,当然在实际应用中会涉及线程池、消息队列、内存管理等等,不在这个示例展示范围。下面我只记录了我碰到的问题:

    问题一:AcceptEx成功,但有客户端连接时,GetQueuedCompletionStatus却不返回,后来把ListenSocket用CreateIoCompletionPort绑定到完在端口之后问题不再出现,因为之前用WSAAccept,就没有把ListenSocket绑定。

    问题二:10014错误,在一开始时,gOverls用了array[0..ACCEPT_COUNT - 1] of TIOCPRecord,用这样的类型时,AcceptEx是成功的,也能接收几个连接,但是测试的连接不完全能连上,后来改用array[0..ACCEPT_COUNT - 1] of PIOCPRecord,用New分配内存时,测试连接能全部连上,分析原因,可能是栈内存与堆内存的区别。另外一次出现10014是把TWSABUF中的u_long类型改为int64类型后出现这个错。

    问题三:首次GetQueuedCompletionStatus的完键不是预期的那个,即soAccept时的那个完成键并不是想要的那个,连接后正常。我一开始AcceptEx时就已经把每一个待接收的Socket绑定到了完成端口,因为连接非法时不想在DisconnectEx那里判断。

    问题四:要说一下TAcceptEx与TGetAcceptExSockaddrs中的dwReceiveDataLength参数,这个初始值如果不是0,那么当IOCP接到一个连接时并不立即返回,而是收到客户端的数据时才返回。这会导致DOS攻击的大量连接耗尽预设等待的Socket连接,即AcceptEx投递的连接资源,如果设置为0,那么有连接时GetQueuedCompletionStatus就回立即返回,至于是否非法那就仁者见人智者见智了,比如心跳包的检测。使用AcceptEx时,一定要保证IOCP中有空闲的Socket接收客户端。

    问题五:ERROR_IO_PENDING(997),当WSAGetLastError返回这个值时表示已经进入处理中,但并没有处理完。

    问题六:GetQueuedCompletionStatus返回soWrite状态时,buffer的数据不一写就发送完了,没有发送完的数据继续WSASend。

   

    下图是我写完这个示例后对IOCP中那几个API关系的理解,注意图中的箭头方向,PostQueuedCompletionStatus,AcceptEx,WSARecv, WSASend, DisconnectEx都是向IOCP内部投递数据,投递完后立即返回,这并不意味着投递的数据就会立即被处理,可以理解为进入一个等待处理队列,这几个方法可以投递多个数据不阻塞。PostQueuedCompletionStatus一般用于结束工作线程时使用,也就是GetQueuedCompletionStatus会得到PostQueuedCompletionStatus的状态信息。所有IOCP内部处理完的数据都会通过GetQueuedCompletionStatus这个方法反回,比如收到客户端请求后,发送数据到客户端后。这是一个阻塞的方法,当然可以设置超时。每一个工作线程也就通过GetQueuedCompletionStatus这个方法来处理消息,具体可以看后面的附加代码。

附加IOCPsever.dpr与WinSock2.pas:

  1 program IOCPServer;
  2 
  3 {$APPTYPE CONSOLE}
  4 
  5 uses
  6   SysUtils,  windows,
  7   WinSock2 in 'winsock2.pas';
  8 
  9 const
 10   WINSOCK_VERSION = $0202;
 11   LISTEN_PORT = 6553;                   //监听端口
 12   MAX_BUFFSIZE = 4096;                 //数据buffer
 13   ACCEPT_COUNT = 10;                   //接收连接数
 14   SHUTDOWN_FLAG = $FFFFFFFF;    //退出标记
 15 
 16   SO_UPDATE_ACCEPT_CONTEXT = $700B;
 17   TF_REUSE_SOCKET          = $02;
 18   IOC_IN               =$80000000;
 19   IOC_VENDOR           =$18000000;
 20   IOC_OUT              =$40000000;
 21   SIO_KEEPALIVE_VALS   =IOC_IN or IOC_VENDOR or 4;
 22 
 23   WSAID_GETACCEPTEXSOCKADDRS: System.TGuid = (D1:$b5367df2;D2:$cbac;D3:$11cf;D4:($95,$ca,$00,$80,$5f,$48,$a1,$92));
 24   WSAID_ACCEPTEX: System.TGuid = (D1:$b5367df1;D2:$cbac;D3:$11cf;D4:($95,$ca,$00,$80,$5f,$48,$a1,$92));
 25   WSAID_CONNECTEX: System.TGuid = (D1:$25a207b9;D2:$ddf3;D3:$4660;D4:($8e,$e9,$76,$e5,$8c,$74,$06,$3e));
 26   WSAID_DISCONNECTEX: System.TGuid = (D1:$7fda2e11;D2:$8630;D3:$436f;D4:($a0,$31,$f5,$36,$a6,$ee,$c1,$57));
 27 
 28 type
 29   TAcceptEx = function(sListenSocket, sAcceptSocket: TSocket;
 30          lpOutputBuffer: Pointer; dwReceiveDataLength, dwLocalAddressLength,
 31          dwRemoteAddressLength: LongWord; var lpdwBytesReceived: LongWord;
 32          lpOverlapped: POverlapped): BOOL; stdcall;
 33 
 34   TGetAcceptExSockaddrs = procedure(lpOutputBuffer: Pointer;
 35          dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
 36          var LocalSockaddr: PSockAddr; var LocalSockaddrLength: Integer;
 37          var RemoteSockaddr: PSockAddr; var RemoteSockaddrLength: Integer);stdcall;
 38 
 39   TConnectEx = function(const s : TSocket; const name: PSOCKADDR; const
 40       namelen: Integer; lpSendBuffer : Pointer; dwSendDataLength : DWORD; var
 41       lpdwBytesSent : LongWord; lpOverlapped : POverlapped): BOOL; stdcall;
 42 
 43   TDisconnectEx = function(const hSocket : TSocket; lpOverlapped: POverlapped;
 44      const dwFlags : LongWord; const dwReserved : LongWord) : BOOL; stdcall;
 45 
 46   PTCPKeepAlive = ^TTCPKeepAlive;
 47   TTCPKeepAlive = packed record
 48     KeepOn: integer;
 49     KeepTime: integer;
 50     KeepInterval: integer;
 51   end;
 52 
 53   TSockOperate = (soAccept, soDisconnect, soRead, soWrite);
 54   PIOCPRecord = ^TIOCPRecord;
 55   TIOCPRecord = packed record
 56     Ovelpd: TOverlapped;
 57     WsaBuf: TWsaBuf;
 58     Buffer: array [0..MAX_BUFFSIZE - 1] of AnsiChar;
 59     operate: TSockOperate;
 60     sock: TSocket;
 61   end;
 62 
 63 var
 64   gListen: TSocket;
 65   gOverls: array[0..ACCEPT_COUNT - 1] of PIOCPRecord;
 66   gIOCP: THandle = 0;
 67   gWorker: THandle;
 68   gFunAcceptEx: TAcceptEx = nil;
 69   gFunGetAcceptEx: TGetAcceptExSockaddrs = nil;
 70   gFunConnectEx: TConnectEx = nil;
 71   gFunDisconnectEx: TDisconnectEx = nil;
 72 
 73 //加载扩展函数
 74 function LoadFunEx(ASock: TSocket): Boolean;
 75 var
 76   tag: LongWord;
 77 begin
 78   Result := False;
 79   if ASock = INVALID_SOCKET then Exit;
 80   try
 81     tag := 0;
 82     if SOCKET_ERROR = WSAIoctl(ASock, SIO_GET_EXTENSION_FUNCTION_POINTER,
 83                                @WSAID_ACCEPTEX, SizeOf(WSAID_ACCEPTEX),
 84                                @@gFunAcceptEx, SizeOf(Pointer), @tag, nil, nil)then
 85     begin
 86       gFunAcceptEx := nil;
 87       Exit;
 88     end;
 89 
 90     tag := 0;
 91     if SOCKET_ERROR = WSAIoctl(ASock, SIO_GET_EXTENSION_FUNCTION_POINTER,
 92                                @WSAID_GETACCEPTEXSOCKADDRS, SizeOf(WSAID_GETACCEPTEXSOCKADDRS),
 93                                @@gFunGetAcceptEx, SizeOf(Pointer), @tag, nil, nil)then
 94     begin
 95       gFunGetAcceptEx := nil;
 96       Exit;
 97     end;
 98 
 99     if SOCKET_ERROR = WSAIoctl(ASock, SIO_GET_EXTENSION_FUNCTION_POINTER,
100                                @WSAID_CONNECTEX,  SizeOf(WSAID_CONNECTEX),
101                                @@gFunConnectEx,  SizeOf(Pointer), @tag, nil,  nil)then
102     begin
103       gFunConnectEx := nil;
104       Exit;
105     end;
106 
107     if SOCKET_ERROR = WSAIoctl(ASock, SIO_GET_EXTENSION_FUNCTION_POINTER,
108                                @WSAID_DISCONNECTEX,  SizeOf(WSAID_DISCONNECTEX),
109                                @@gFunDisconnectEx,  SizeOf(Pointer), @tag, nil,  nil)then
110     begin
111       gFunDisconnectEx := nil;
112       Exit;
113     end; 
114     Result := True;
115   except
116   end;
117 end;
118 
119 //判断socket是否有效
120 function IsSocketAlive(ASock: TSocket): Boolean;
121 var
122   tmp: LongWord;
123 begin
124   Result := WinSock2.send(ASock, tmp, 0, 0) <> -1;
125 end;
126 
127 //设置心跳
128 procedure SetKeepLive(ASock: TSocket);
129 var
130   opt: Integer;
131   dwFlags: DWORD;
132   inKeepAlive, OutKeepAlive: TTCPKeepAlive;
133 begin
134   if ASock <> INVALID_SOCKET then
135   begin
136     opt := 1;
137     inKeepAlive.KeepOn := 1;
138     inKeepAlive.KeepTime := 5000;
139     inKeepAlive.KeepInterval := 1;
140 
141     if (SetSockOpt(ASock, SOL_SOCKET, SO_KEEPALIVE, @opt, SizeOf(opt)) = SOCKET_ERROR)
142     or (WSAIoctl(ASock, SIO_KEEPALIVE_VALS, @inKeepAlive,SizeOf(TTCPKeepAlive),
143         @outKeepAlive, SizeOf(TTCPKeepAlive), @dwFlags, nil, nil) = SOCKET_ERROR) then
144       WriteLn('设置心跳错误 socket: ' + Inttostr(ASock) + 'Error: ' + Inttostr(WSAGetLastError) );
145   end;
146 end;
147 
148 //关闭socket
149 procedure FunCloseSocket(ASock: TSocket);
150 var
151   Linger: TLinger;
152 begin
153   if ASock <> INVALID_SOCKET then
154   begin
155     FillChar(Linger, SizeOf(TLinger), 0);
156     setsockopt(ASock, SOL_SOCKET, SO_LINGER, @Linger, Sizeof(Linger));
157     closesocket(ASock);
158   end;
159 end;
160 
161 procedure ResetData(PData: PIOCPRecord);
162 var
163   sock: TSocket;
164 begin
165   if Assigned(PData) then
166   begin
167     sock := PData.sock;
168     FillChar(PData^, SizeOf(TIOCPRecord), 0);
169     PData^.WsaBuf.len := MAX_BUFFSIZE;
170     PData^.WsaBuf.buf := @(PData^.Buffer[0]);
171     PData.sock := sock;
172   end;
173 end;
174 
175 //投递一个接收socket
176 function PostAccept(PAccept: PIOCPRecord): Boolean;
177 var
178   dwBytes: LongWord;
179 begin
180   Result := False;
181   if Assigned(PAccept) and (PAccept^.sock <> INVALID_SOCKET)  then
182   begin
183     ResetData(PAccept);
184     PAccept^.operate := soAccept;
185     dwBytes := 0;
186     Result := gFunAcceptEx(gListen, PAccept^.sock, PAccept^.Wsabuf.buf, 0,
187                            SizeOf(TSockAddrIn) + 16, SizeOf(TSockAddrIn) + 16,
188                            dwBytes, @(PAccept^.Ovelpd))
189       or (ERROR_IO_PENDING = WSAGetLastError);
190   end;
191 end;
192 
193 //投递一个断开socket
194 function PostDisconnect(PData: PIOCPRecord): Boolean;
195 begin
196   Result := False;
197   if Assigned(PData) and (PData^.sock <> INVALID_SOCKET)  then
198   begin
199     ResetData(PData);
200     PData^.operate := soDisconnect;
201     WinSock2.shutdown(PData^.sock, SD_BOTH);
202     Result := gFunDisconnectEx(PData^.sock, @(PData^.Ovelpd), TF_REUSE_SOCKET, 0)
203        or (ERROR_IO_PENDING = WSAGetLastError);
204     if Result then
205       WriteLn('客户端断开:socket ' + Inttostr(PData^.sock))
206     else
207       WriteLn('客户端断开错误:socket ' + Inttostr(PData^.sock) + ' WSAError: ' + Inttostr(WSAGetLastError));
208   end;
209 end;
210 
211 //投递接收数据缓冲
212 function PostRecv(PData: PIOCPRecord): Boolean;
213 var
214   dwBuff, dwRecv: LongWord;
215 begin
216   Result := False;
217   if Assigned(PData) and (PData^.sock <> INVALID_SOCKET)  then
218   begin
219     ResetData(PData);
220     PData^.operate := soRead;
221     dwBuff := 0;
222     dwRecv := 0;
223     Result := (WSARecv(PData^.sock, @(PData^.WsaBuf), 1, @dwBuff, @dwRecv, @(PData^.Ovelpd), nil) <> SOCKET_ERROR)
224        or (ERROR_IO_PENDING = WSAGetLastError);
225   end;
226 end;
227 
228 procedure WriteError(AInfo: String);
229 begin
230   WriteLn(AInfo + ' WSAError: ' + Inttostr(WSAGetLastError));
231 end;
232 
233 //工作线程
234 function WorkProc(PValue: Pointer): Integer;stdcall;
235 var
236   data: PIOCPRecord;
237   workCount, dwSend, dwFlags: Cardinal;
238   sock: TSocket;
239   str: AnsiString;
240   remoteAddr, localAddr: PSockAddrin;
241   remoteLen, localLen, opt: Integer;
242 begin
243   Result := 0;
244   while true do
245   begin
246     data := nil;
247     workCount := 0;
248     sock := 0;
249     if not GetQueuedCompletionStatus(gIOCP, workCount, Cardinal(sock), POVerlapped(data), INFINITE) then
250     begin //有可能是客服端断开
251       if Assigned(data) then
252         PostDisconnect(data);
253       Continue;
254     end;
255     WriteLn('Worker GetQueued socket:' + inttostr(sock));
256     if Cardinal(data) = SHUTDOWN_FLAG then Break; // 有退出
257     if not Assigned(data) then continue;
258 
259     case data^.operate of
260       soAccept:
261       begin
262         gFunGetAcceptEx(Data^.WsaBuf.buf, 0, SizeOf(TSockAddrIn) + 16, SizeOf(TSockAddrIn) + 16,
263                  PSockAddr(localAddr), localLen, PSockAddr(remoteAddr), remoteLen);
264         WriteLn('接入IP: ' + inet_ntoa(remoteAddr^.sin_addr) + ' Port: ' + Inttostr(ntohs(remoteAddr^.sin_port)));
265         SetSockOpt(data^.sock, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, PAnsiChar(@(gListen)), SizeOf(gListen));
266         SetKeepLive(data^.sock);
267           
268         if PostRecv(data) then
269           WriteLn('Accept 数据 socket: ' + Inttostr(data^.sock))
270         else
271           WriteError('Accept 错误 socket: ' + inttostr(data^.sock));
272       end;
273       soDisconnect:
274       begin
275         if PostAccept(data) then
276           WriteLn('投递Acceptex socket: ' + Inttostr(data^.sock))
277         else
278           WriteError('Disconnectex投递错误 socket: ' + Inttostr(data^.sock));
279       end;
280       soWrite:
281       begin
282         if workCount = 0 then
283           PostDisconnect(data)
284         else begin
285           data^.WsaBuf.len := data^.WsaBuf.len - workCount;
286           if data^.WsaBuf.len <= 0 then
287           begin
288             WriteLn('服务器回复数据完成 socket: ' + inttostr(data^.sock));
289             PostRecv(data);
290             continue;
291           end;
292           dwSend := 0;
293           dwFlags := 0;
294           FillChar(data^.Ovelpd, Sizeof(data^.Ovelpd), 0);
295           if (WSASend(data^.sock, @(data^.WsaBuf), 1, @dwSend, dwFlags, @data^.Ovelpd, nil)<>SOCKET_ERROR)
296           or (ERROR_IO_PENDING = WSAGetLastError) then
297             WriteLn('发送数据 socket: ' + Inttostr(data^.sock))
298           else begin
299             WriteError('发送数据错误 socket: ' + Inttostr(data^.sock));
300           end;
301 
302           if dwSend = SOCKET_ERROR then//客户端断开
303             PostDisconnect(data)
304         end;
305       end;
306       soRead:
307       begin
308         if workCount = 0 then
309           PostDisconnect(data)
310         else begin
311           sock := data^.sock;
312           SetLength(str, workCount);
313           Move(data^.Buffer[0], str[1], workCount);
314           WriteLn('接收数据 socket: ' + Inttostr(sock) + ' str: ' + str);
315           str := '服务器回复:' + str;
316           
317           dwSend := 0;
318           dwFlags := 0;
319           FillChar(data^, SizeOf(TIOCPRecord), 0);
320           data^.WsaBuf.len := Length(str);
321           data^.WsaBuf.buf := @(data^.Buffer[0]);
322           data^.operate := soWrite;
323           data^.sock := sock;
324           Move(str[1], data^.Buffer[0], data^.WsaBuf.len);
325           if not ( (WSASend(sock, @(data^.WsaBuf), 1, @dwSend, dwFlags, @(data^.Ovelpd), nil) <> SOCKET_ERROR)
326                    or (WSAGetlastError =  ERROR_IO_PENDING) ) then
327           begin
328             WriteLn('服务器回复数据失败 socket: ' + Inttostr(sock));
329             PostRecv(data);
330           end
331           else
332             WriteLn('服务器回复数据 socket: ' + Inttostr(sock));
333         end;
334       end;
335     end; // end of case
336   end;// end of while
337 end;
338 
339 var
340   threadID: Cardinal;
341   i: Integer;
342   need: Boolean;
343   WSData: TWSAData;
344   addr: TSockAddr;
345   console: array[0..255] of AnsiChar;
346   label exitLabel;
347 begin
348 
349   try
350     need := True;
351 
352     WriteLn('初始化网络环境');
353     if WSAStartup(WINSOCK_VERSION, WSData) <> 0 then goto exitLabel;
354 
355     WriteLn('创建完成端口');
356     gIOCP := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
357     if gIOCP = 0 then  goto exitLabel;
358 
359     WriteLn('创建监听Socket');
360     gListen := WSASocket(PF_INET, SOCK_STREAM, 0, nil, 0, WSA_FLAG_OVERLAPPED);
361     if gListen = INVALID_SOCKET then goto exitLabel;
362 
363     WriteLn('加载扩展函数');
364     if not LoadFunEx(gListen) then goto exitLabel;
365 
366     WriteLn('邦定监听Socket 与IOCP ['  + inttostr(gListen) + '][' + inttostr(gIOCP) + ']');
367     if CreateIoCompletionPort(gListen, gIOCP, gListen, 0) = 0 then goto exitLabel;
368 
369     WriteLn('邦定监听Socket 与IP');
370     FillChar(Addr, SizeOf(TSockAddrIn), 0);
371     Addr.sin_family := AF_INET;
372     Addr.sin_port := htons(LISTEN_PORT);
373     Addr.sin_addr.S_addr := htonl(INADDR_ANY);
374     //Addr.sin_addr.S_addr := inet_addr('0.0.0.0');
375     if WinSock2.bind(gListen, @Addr, SizeOf(TSockAddr)) <> 0 then goto exitLabel;
376 
377     WriteLn('开始监听Socket');
378     if WinSock2.listen(gListen, SOMAXCONN) <> 0 then goto exitLabel;
379 
380     WriteLn('投递接收Socket');
381     FillChar(gOverls[0], SizeOf(gOverls), 0);
382     for i := 0 to ACCEPT_COUNT - 1 do
383     begin
384       New(gOverls[i]);
385       gOverls[i]^.sock := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, WSA_FLAG_OVERLAPPED);
386       if gOverls[i]^.sock = INVALID_SOCKET then goto exitLabel;
387       if CreateIoCompletionPort(gOverls[i]^.sock, gIOCP, gOverls[i]^.sock, 0) = 0 then goto exitLabel;
388       if PostAccept(gOverls[i]) then
389         WriteLn('投递Socket:' + Inttostr(gOverls[i]^.sock))
390       else goto exitLabel;
391     end;
392 
393     //处理完端口请求
394     WriteLn('创建工作线程 ');
395     gWorker := BeginThread(nil, 0, @WorkProc, nil, 0, threadID);
396     if gWorker = 0 then goto exitLabel;
397 
398     WriteLn('键入exit退出 ');
399     while True do
400     begin
401       ReadLn(console);
402       if console = 'exit' then
403         Break;
404       console := '';
405     end;
406      
407     WriteLn('投递完成端口结束标记, 退出工作线程');
408     if not PostQueuedCompletionStatus(gIOCP, 0, 0, Pointer(SHUTDOWN_FLAG)) then
409     begin
410       WriteLn('投递完成端口结束标记错误:' + inttostr(GetLastError));
411       TerminateThread(gWorker, 0);
412     end;
413 
414     WriteLn('关闭工作线程句柄');
415     CloseHandle(gWorker);
416 
417     WriteLn('释放socket资源');
418     for i := 0 to ACCEPT_COUNT - 1 do
419       Dispose(gOverls[i]);
420     FillChar(gOverls[0], SizeOf(gOverls), 0);
421 
422     WriteLn('关闭监听端口');
423     FunCloseSocket(gListen);
424 
425     WriteLn('关闭完成端口');
426     CloseHandle(gIOCP);
427 
428     WriteLn('释放网络环境');
429     WSACleanup;
430 
431     need := false;
432     
433     exitLabel:
434       if need then
435         WriteLn('运行错误:' + Inttostr(WSAGetLastError));
436 
437   except
438     on e:Exception do
439       WriteLn(e.Message);
440   end;
441 
442 end.
IOCPServer.dpr
   1 {*******************************************************}
   2 {                                                       }
   3 {       Windows Sockets API v. 2.20 Header File         }
   4 {                                                       }
   5 {        Prerelease 16.09.96                                 }
   6 {                                                       }
   7 {       Base:      WinSock2.h from Winsock SDK 1.6 BETA    }
   8 {               Delphi 2 RTL Windows32 API Interface    } 
   9 {                                                       }
  10 {       (c) 1996 by Artur Grajek 'AHS'                  }
  11 {    email: c51725ag@juggernaut.eti.pg.gda.pl              }
  12 {                                                       }
  13 {*******************************************************}
  14 {$MINENUMSIZE 4} { Force 4 bytes enumeration size}
  15 
  16 unit WinSock2;
  17 
  18 interface
  19 
  20 uses Windows;
  21 
  22 type
  23   u_char = Char;
  24   u_short = Word;
  25   u_int = Integer;
  26   u_long = Longint;
  27   pu_long = ^u_long;
  28   pu_short = ^u_short;
  29 
  30 { The new type to be used in all
  31   instances which refer to sockets. }
  32   TSocket = u_int;
  33 
  34 const
  35   FD_SETSIZE     =   64;
  36 
  37 type
  38   PFDSet = ^TFDSet;
  39   TFDSet = packed record
  40     fd_count: u_int;
  41     fd_array: array[0..FD_SETSIZE-1] of TSocket;
  42   end;
  43 
  44   PTimeVal = ^TTimeVal;
  45   TTimeVal = packed record
  46     tv_sec: Longint;
  47     tv_usec: Longint;
  48   end;
  49 
  50 const
  51   IOCPARM_MASK = $7f;
  52   IOC_VOID     = $20000000;
  53   IOC_OUT      = $40000000;
  54   IOC_IN       = $80000000;
  55   IOC_INOUT    = (IOC_IN or IOC_OUT);
  56 
  57   FIONREAD     = IOC_OUT or { get # bytes to read }
  58     ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
  59     (Longint(Byte('f')) shl 8) or 127;
  60   FIONBIO      = IOC_IN or { set/clear non-blocking i/o }
  61     ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
  62     (Longint(Byte('f')) shl 8) or 126;
  63   FIOASYNC     = IOC_IN or { set/clear async i/o }
  64     ((Longint(SizeOf(Longint)) and IOCPARM_MASK) shl 16) or
  65     (Longint(Byte('f')) shl 8) or 125;
  66 
  67 
  68 const
  69 
  70 { Protocols }
  71 
  72   IPPROTO_IP     =   0;        { Dummy                    }
  73   IPPROTO_ICMP   =   1;        { Internet Control Message Protocol }
  74   IPPROTO_IGMP   =   2;        { Internet Group Management Protocol}
  75   IPPROTO_GGP    =   3;        { Gateway                           }
  76   IPPROTO_TCP    =   6;        { TCP                       }
  77   IPPROTO_PUP    =   12;    { PUP                    }
  78   IPPROTO_UDP    =   17;    { User Datagram Protocol        }
  79   IPPROTO_IDP    =   22;    { XNS IDP                }
  80   IPPROTO_ND     =   77;    { UNOFFICIAL Net Disk Protocol    }
  81 
  82   IPPROTO_RAW    =   255;
  83   IPPROTO_MAX    =   256;
  84 
  85 { Port/socket numbers: network standard functions}
  86 
  87   IPPORT_ECHO    =   7;
  88   IPPORT_DISCARD =   9;
  89   IPPORT_SYSTAT  =   11;
  90   IPPORT_DAYTIME =   13;
  91   IPPORT_NETSTAT =   15;
  92   IPPORT_FTP     =   21;
  93   IPPORT_TELNET  =   23;
  94   IPPORT_SMTP    =   25;
  95   IPPORT_TIMESERVER  =  37;
  96   IPPORT_NAMESERVER  =  42;
  97   IPPORT_WHOIS       =  43;
  98   IPPORT_MTP         =  57;
  99 
 100 { Port/socket numbers: host specific functions }
 101 
 102   IPPORT_TFTP        =  69;
 103   IPPORT_RJE         =  77;
 104   IPPORT_FINGER      =  79;
 105   IPPORT_TTYLINK     =  87;
 106   IPPORT_SUPDUP      =  95;
 107 
 108 { UNIX TCP sockets }
 109   
 110   IPPORT_EXECSERVER  =  512;
 111   IPPORT_LOGINSERVER =  513;
 112   IPPORT_CMDSERVER   =  514;
 113   IPPORT_EFSSERVER   =  520;
 114   
 115 { UNIX UDP sockets }
 116 
 117   IPPORT_BIFFUDP     =  512;
 118   IPPORT_WHOSERVER   =  513;
 119   IPPORT_ROUTESERVER =  520;
 120   
 121 { Ports < IPPORT_RESERVED are reserved for
 122   privileged processes (e.g. root). }
 123 
 124   IPPORT_RESERVED    =  1024;
 125   
 126 { Link numbers }
 127 
 128   IMPLINK_IP         =  155;
 129   IMPLINK_LOWEXPER   =  156;
 130   IMPLINK_HIGHEXPER  =  158;
 131 
 132 type
 133   SunB = packed record
 134     s_b1, s_b2, s_b3, s_b4: u_char;
 135   end;
 136 
 137   SunW = packed record
 138     s_w1, s_w2: u_short;
 139   end;
 140 
 141   PInAddr = ^TInAddr;
 142   TInAddr = packed record
 143     case integer of
 144       0: (S_un_b: SunB);
 145       1: (S_un_w: SunW);
 146       2: (S_addr: u_long);
 147   end;
 148 
 149   PSockAddrIn = ^TSockAddrIn;
 150   TSockAddrIn = packed record
 151     case Integer of
 152       0: (sin_family: u_short;
 153           sin_port: u_short;
 154           sin_addr: TInAddr;
 155           sin_zero: array[0..7] of Char);
 156       1: (sa_family: u_short;
 157           sa_data: array[0..13] of Char)
 158   end;
 159 type
 160   PHostEnt = ^THostEnt;
 161   THostEnt = packed record
 162     h_name: PChar;
 163     h_aliases: ^PChar;
 164     h_addrtype: Smallint;
 165     h_length: Smallint;
 166     case integer of
 167      0: (h_addr_list: ^PChar);
 168      1: (h_addr: ^PInAddr);
 169   end;
 170 
 171   PNetEnt = ^TNetEnt;
 172   TNetEnt = packed record
 173     n_name: PChar;
 174     n_aliases: ^PChar;
 175     n_addrtype: Smallint;
 176     n_net: u_long;
 177   end;
 178 
 179   PServEnt = ^TServEnt;
 180   TServEnt = packed record
 181     s_name: PChar;
 182     s_aliases: ^PChar;
 183     s_port: Smallint;
 184     s_proto: PChar;
 185   end;
 186 
 187   PProtoEnt = ^TProtoEnt;
 188   TProtoEnt = packed record
 189     p_name: PChar;
 190     p_aliases: ^Pchar;
 191     p_proto: Smallint;
 192   end;
 193 
 194 const
 195   INADDR_ANY       = $00000000;
 196   INADDR_LOOPBACK  = $7F000001;
 197   INADDR_BROADCAST = $FFFFFFFF;
 198   INADDR_NONE      = $FFFFFFFF;
 199   
 200   ADDR_ANY         = INADDR_ANY;
 201 
 202 const
 203   WSADESCRIPTION_LEN     =   256;
 204   WSASYS_STATUS_LEN      =   128;
 205 
 206 type
 207   PWSAData = ^TWSAData;
 208   TWSAData = packed record
 209     wVersion: Word;
 210     wHighVersion: Word;
 211     szDescription: array[0..WSADESCRIPTION_LEN] of Char;
 212     szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char;
 213     iMaxSockets: Word;
 214     iMaxUdpDg: Word;
 215     lpVendorInfo: PChar;
 216   end;
 217 
 218   PTransmitFileBuffers = ^TTransmitFileBuffers;
 219   TTransmitFileBuffers = packed record
 220       Head: Pointer;
 221       HeadLength: DWORD;
 222       Tail: Pointer;
 223       TailLength: DWORD;
 224   end;
 225 
 226 const
 227 
 228 { Options for use with [gs]etsockopt at the IP level. }
 229 
 230   IP_OPTIONS          = 1;
 231   IP_MULTICAST_IF     = 2;           { set/get IP multicast interface   }
 232   IP_MULTICAST_TTL    = 3;           { set/get IP multicast timetolive  }
 233   IP_MULTICAST_LOOP   = 4;           { set/get IP multicast loopback    }
 234   IP_ADD_MEMBERSHIP   = 5;           { add  an IP group membership      }
 235   IP_DROP_MEMBERSHIP  = 6;           { drop an IP group membership      }
 236 
 237   IP_DEFAULT_MULTICAST_TTL   = 1;    { normally limit m'casts to 1 hop  }
 238   IP_DEFAULT_MULTICAST_LOOP  = 1;    { normally hear sends if a member  }
 239   IP_MAX_MEMBERSHIPS         = 20;   { per socket; must fit in one mbuf }
 240 
 241 { This is used instead of -1, since the
 242   TSocket type is unsigned.}
 243 
 244   INVALID_SOCKET        = TSocket(NOT(0));
 245   SOCKET_ERROR        = -1;
 246 
 247 { The  following  may  be used in place of the address family, socket type, or
 248   protocol  in  a  call  to WSASocket to indicate that the corresponding value
 249   should  be taken from the supplied WSAPROTOCOL_INFO structure instead of the
 250   parameter itself.
 251  }
 252 
 253   FROM_PROTOCOL_INFO    = -1;
 254 
 255 { Types }
 256 
 257   SOCK_STREAM     = 1;               { stream socket }
 258   SOCK_DGRAM      = 2;               { datagram socket }
 259   SOCK_RAW        = 3;               { raw-protocol interface }
 260   SOCK_RDM        = 4;               { reliably-delivered message }
 261   SOCK_SEQPACKET  = 5;               { sequenced packet stream }
 262 
 263 { Option flags per-socket. }
 264 
 265   SO_DEBUG        = $0001;          { turn on debugging info recording }
 266   SO_ACCEPTCONN   = $0002;          { socket has had listen() }
 267   SO_REUSEADDR    = $0004;          { allow local address reuse }
 268   SO_KEEPALIVE    = $0008;          { keep connections alive }
 269   SO_DONTROUTE    = $0010;          { just use interface addresses }
 270   SO_BROADCAST    = $0020;          { permit sending of broadcast msgs }
 271   SO_USELOOPBACK  = $0040;          { bypass hardware when possible }
 272   SO_LINGER       = $0080;          { linger on close if data present }
 273   SO_OOBINLINE    = $0100;          { leave received OOB data in line }
 274 
 275   SO_DONTLINGER  =   $ff7f;
 276 
 277 { Additional options. }
 278 
 279   SO_SNDBUF       = $1001;          { send buffer size }
 280   SO_RCVBUF       = $1002;          { receive buffer size }
 281   SO_SNDLOWAT     = $1003;          { send low-water mark }
 282   SO_RCVLOWAT     = $1004;          { receive low-water mark }
 283   SO_SNDTIMEO     = $1005;          { send timeout }
 284   SO_RCVTIMEO     = $1006;          { receive timeout }
 285   SO_ERROR        = $1007;          { get error status and clear }
 286   SO_TYPE         = $1008;          { get socket type }
 287 
 288 { Options for connect and disconnect data and options.  Used only by
 289   non-TCP/IP transports such as DECNet, OSI TP4, etc. }
 290 
 291   SO_CONNDATA     = $7000;
 292   SO_CONNOPT      = $7001;
 293   SO_DISCDATA     = $7002;
 294   SO_DISCOPT      = $7003;
 295   SO_CONNDATALEN  = $7004;
 296   SO_CONNOPTLEN   = $7005;
 297   SO_DISCDATALEN  = $7006;
 298   SO_DISCOPTLEN   = $7007;
 299 
 300 { WinSock 2 extension -- new options }
 301  
 302   SO_GROUP_ID       = $2001; { ID of a socket group}
 303   SO_GROUP_PRIORITY = $2002; { the relative priority within a group}
 304   SO_MAX_MSG_SIZE   = $2003; { maximum message size }
 305   SO_PROTOCOL_INFOA = $2004; { WSAPROTOCOL_INFOA structure }
 306   SO_PROTOCOL_INFOW = $2005; { WSAPROTOCOL_INFOW structure }
 307 
 308 {$IFDEF UNICODE }
 309   SO_PROTOCOL_INFO  = SO_PROTOCOL_INFOW;
 310 {$ELSE }
 311   SO_PROTOCOL_INFO  = SO_PROTOCOL_INFOA;
 312 {$ENDIF UNICODE }
 313   PVD_CONFIG        = $3001; {configuration info for service provider }
 314 
 315 { Option for opening sockets for synchronous access. }
 316 
 317   SO_OPENTYPE     = $7008;
 318 
 319   SO_SYNCHRONOUS_ALERT    = $10;
 320   SO_SYNCHRONOUS_NONALERT = $20;
 321 
 322 { Other NT-specific options. }
 323 
 324   SO_MAXDG        = $7009;
 325   SO_MAXPATHDG    = $700A;
 326 
 327 { TCP options. }
 328 
 329   TCP_NODELAY     = $0001;
 330   TCP_BSDURGENT   = $7000;
 331 
 332 { Address families. }
 333 
 334   AF_UNSPEC       = 0;               { unspecified }
 335   AF_UNIX         = 1;               { local to host (pipes, portals) }
 336   AF_INET         = 2;               { internetwork: UDP, TCP, etc. }
 337   AF_IMPLINK      = 3;               { arpanet imp addresses }
 338   AF_PUP          = 4;               { pup protocols: e.g. BSP }
 339   AF_CHAOS        = 5;               { mit CHAOS protocols }
 340   AF_IPX          = 6;               { IPX and SPX }
 341   AF_NS           = 6;               { XEROX NS protocols }
 342   AF_ISO          = 7;               { ISO protocols }
 343   AF_OSI          = AF_ISO;          { OSI is ISO }
 344   AF_ECMA         = 8;               { european computer manufacturers }
 345   AF_DATAKIT      = 9;               { datakit protocols }
 346   AF_CCITT        = 10;              { CCITT protocols, X.25 etc }
 347   AF_SNA          = 11;              { IBM SNA }
 348   AF_DECnet       = 12;              { DECnet }
 349   AF_DLI          = 13;              { Direct data link interface }
 350   AF_LAT          = 14;              { LAT }
 351   AF_HYLINK       = 15;              { NSC Hyperchannel }
 352   AF_APPLETALK    = 16;              { AppleTalk }
 353   AF_NETBIOS      = 17;              { NetBios-style addresses }
 354   AF_VOICEVIEW    = 18;              { VoiceView }
 355   AF_FIREFOX      = 19;              { FireFox }
 356   AF_UNKNOWN1     = 20;              { Somebody is using this! }
 357   AF_BAN          = 21;              { Banyan }
 358   AF_ATM          = 22;              { Native ATM Services }
 359   AF_INET6        = 23;              { Internetwork Version 6 }
 360 
 361   AF_MAX          = 24;
 362 
 363 type
 364   { Structure used by kernel to store most addresses. }
 365 
 366   PSockAddr = ^TSockAddr;
 367   TSockAddr = TSockAddrIn;
 368 
 369   { Structure used by kernel to pass protocol information in raw sockets. }
 370   PSockProto = ^TSockProto;
 371   TSockProto = packed record
 372     sp_family: u_short;
 373     sp_protocol: u_short;
 374   end;
 375 
 376 const
 377 { Protocol families, same as address families for now. }
 378 
 379   PF_UNSPEC       = AF_UNSPEC;
 380   PF_UNIX         = AF_UNIX;
 381   PF_INET         = AF_INET;
 382   PF_IMPLINK      = AF_IMPLINK;
 383   PF_PUP          = AF_PUP;
 384   PF_CHAOS        = AF_CHAOS;
 385   PF_NS           = AF_NS;
 386   PF_IPX          = AF_IPX;
 387   PF_ISO          = AF_ISO;
 388   PF_OSI          = AF_OSI;
 389   PF_ECMA         = AF_ECMA;
 390   PF_DATAKIT      = AF_DATAKIT;
 391   PF_CCITT        = AF_CCITT;
 392   PF_SNA          = AF_SNA;
 393   PF_DECnet       = AF_DECnet;
 394   PF_DLI          = AF_DLI;
 395   PF_LAT          = AF_LAT;
 396   PF_HYLINK       = AF_HYLINK;
 397   PF_APPLETALK    = AF_APPLETALK;
 398   PF_VOICEVIEW    = AF_VOICEVIEW;
 399   PF_FIREFOX      = AF_FIREFOX;
 400   PF_UNKNOWN1     = AF_UNKNOWN1;
 401   PF_BAN          = AF_BAN;
 402   PF_ATM          = AF_ATM;
 403   PF_INET6        = AF_INET6;
 404 
 405   PF_MAX          = AF_MAX;
 406 
 407 type
 408 { Structure used for manipulating linger option. }
 409   PLinger = ^TLinger;
 410   TLinger = packed record
 411     l_onoff: u_short;
 412     l_linger: u_short;
 413   end;
 414 
 415 const
 416 { Level number for (get/set)sockopt() to apply to socket itself. }
 417 
 418   SOL_SOCKET      = $ffff;          {options for socket level }
 419 
 420 { Maximum queue length specifiable by listen. }
 421 
 422   SOMAXCONN       = $7fffffff;      { AHS - by硂 5 !?????? }
 423 
 424   MSG_OOB         = $1;             {process out-of-band data }
 425   MSG_PEEK        = $2;             {peek at incoming message }
 426   MSG_DONTROUTE   = $4;             {send without using routing tables }
 427 
 428   MSG_MAXIOVLEN   = 16;
 429 
 430   MSG_PARTIAL     = $8000;          {partial send or recv for message xport }
 431 
 432 { WinSock 2 extension -- new flags for WSASend(), WSASendTo(), WSARecv() and
 433   WSARecvFrom() }
 434 
 435   MSG_INTERRUPT   = $10;            {send/recv in the interrupt context}
 436 
 437 { Define constant based on rfc883, used by gethostbyxxxx() calls. }
 438 
 439   MAXGETHOSTSTRUCT        = 1024;
 440 
 441 { Define flags to be used with the WSAAsyncSelect() call. }
 442 
 443   FD_READ         = $01;
 444   FD_WRITE        = $02;
 445   FD_OOB          = $04;
 446   FD_ACCEPT       = $08;
 447   FD_CONNECT      = $10;
 448   FD_CLOSE        = $20;
 449   FD_QOS          = $40;
 450   FD_GROUP_QOS    = $80;
 451   FD_MAX_EVENTS    = 8;
 452   FD_ALL_EVENTS    = $100; { AHS - trudno powiedzie? ile powinno by?}
 453 
 454 { All Windows Sockets error constants are biased by WSABASEERR from the "normal" }
 455 
 456   WSABASEERR              = 10000;
 457 
 458 { Windows Sockets definitions of regular Microsoft C error constants }
 459 
 460   WSAEINTR                = (WSABASEERR+4);
 461   WSAEBADF                = (WSABASEERR+9);
 462   WSAEACCES               = (WSABASEERR+13);
 463   WSAEFAULT               = (WSABASEERR+14);
 464   WSAEINVAL               = (WSABASEERR+22);
 465   WSAEMFILE               = (WSABASEERR+24);
 466 
 467 { Windows Sockets definitions of regular Berkeley error constants }
 468 
 469   WSAEWOULDBLOCK          = (WSABASEERR+35);
 470   WSAEINPROGRESS          = (WSABASEERR+36);
 471   WSAEALREADY             = (WSABASEERR+37);
 472   WSAENOTSOCK             = (WSABASEERR+38);
 473   WSAEDESTADDRREQ         = (WSABASEERR+39);
 474   WSAEMSGSIZE             = (WSABASEERR+40);
 475   WSAEPROTOTYPE           = (WSABASEERR+41);
 476   WSAENOPROTOOPT          = (WSABASEERR+42);
 477   WSAEPROTONOSUPPORT      = (WSABASEERR+43);
 478   WSAESOCKTNOSUPPORT      = (WSABASEERR+44);
 479   WSAEOPNOTSUPP           = (WSABASEERR+45);
 480   WSAEPFNOSUPPORT         = (WSABASEERR+46);
 481   WSAEAFNOSUPPORT         = (WSABASEERR+47);
 482   WSAEADDRINUSE           = (WSABASEERR+48);
 483   WSAEADDRNOTAVAIL        = (WSABASEERR+49);
 484   WSAENETDOWN             = (WSABASEERR+50);
 485   WSAENETUNREACH          = (WSABASEERR+51);
 486   WSAENETRESET            = (WSABASEERR+52);
 487   WSAECONNABORTED         = (WSABASEERR+53);
 488   WSAECONNRESET           = (WSABASEERR+54);
 489   WSAENOBUFS              = (WSABASEERR+55);
 490   WSAEISCONN              = (WSABASEERR+56);
 491   WSAENOTCONN             = (WSABASEERR+57);
 492   WSAESHUTDOWN            = (WSABASEERR+58);
 493   WSAETOOMANYREFS         = (WSABASEERR+59);
 494   WSAETIMEDOUT            = (WSABASEERR+60);
 495   WSAECONNREFUSED         = (WSABASEERR+61);
 496   WSAELOOP                = (WSABASEERR+62);
 497   WSAENAMETOOLONG         = (WSABASEERR+63);
 498   WSAEHOSTDOWN            = (WSABASEERR+64);
 499   WSAEHOSTUNREACH         = (WSABASEERR+65);
 500   WSAENOTEMPTY            = (WSABASEERR+66);
 501   WSAEPROCLIM             = (WSABASEERR+67);
 502   WSAEUSERS               = (WSABASEERR+68);
 503   WSAEDQUOT               = (WSABASEERR+69);
 504   WSAESTALE               = (WSABASEERR+70);
 505   WSAEREMOTE              = (WSABASEERR+71);
 506 
 507 { Extended Windows Sockets error constant definitions }
 508 
 509   WSASYSNOTREADY          = (WSABASEERR+91);
 510   WSAVERNOTSUPPORTED      = (WSABASEERR+92);
 511   WSANOTINITIALISED       = (WSABASEERR+93);
 512   WSAEDISCON              = (WSABASEERR+101);
 513   WSAENOMORE              = (WSABASEERR+102);
 514   WSAECANCELLED           = (WSABASEERR+103);
 515   WSAEEINVALIDPROCTABLE   = (WSABASEERR+104);
 516   WSAEINVALIDPROVIDER     = (WSABASEERR+105);
 517   WSAEPROVIDERFAILEDINIT  = (WSABASEERR+106);
 518   WSASYSCALLFAILURE       = (WSABASEERR+107);
 519   WSASERVICE_NOT_FOUND    = (WSABASEERR+108);
 520   WSATYPE_NOT_FOUND       = (WSABASEERR+109);
 521   WSA_E_NO_MORE           = (WSABASEERR+110);
 522   WSA_E_CANCELLED         = (WSABASEERR+111);
 523   WSAEREFUSED             = (WSABASEERR+112);
 524 
 525 { Error return codes from gethostbyname() and gethostbyaddr()
 526   (when using the resolver). Note that these errors are
 527   retrieved via WSAGetLastError() and must therefore follow
 528   the rules for avoiding *****es with error numbers from
 529   specific implementations or language run-time systems.
 530   For this reason the codes are based at WSABASEERR+1001.
 531   Note also that [WSA]NO_ADDRESS is defined only for
 532   compatibility purposes. }
 533 
 534 { Authoritative Answer: Host not found }
 535 
 536   WSAHOST_NOT_FOUND       = (WSABASEERR+1001);
 537   HOST_NOT_FOUND          = WSAHOST_NOT_FOUND;
 538 
 539 { Non-Authoritative: Host not found, or SERVERFAIL }
 540 
 541   WSATRY_AGAIN            = (WSABASEERR+1002);
 542   TRY_AGAIN               = WSATRY_AGAIN;
 543 
 544 { Non recoverable errors, FORMERR, REFUSED, NOTIMP }
 545 
 546   WSANO_RECOVERY          = (WSABASEERR+1003);
 547   NO_RECOVERY             = WSANO_RECOVERY;
 548 
 549 { Valid name, no data record of requested type }
 550 
 551   WSANO_DATA              = (WSABASEERR+1004);
 552   NO_DATA                 = WSANO_DATA;
 553 
 554 { no address, look for MX record }
 555 
 556   WSANO_ADDRESS           = WSANO_DATA;
 557   NO_ADDRESS              = WSANO_ADDRESS;
 558 
 559 { Windows Sockets errors redefined as regular Berkeley error constants.
 560   These are commented out in Windows NT to avoid conflicts with errno.h.
 561   Use the WSA constants instead. }
 562 
 563   EWOULDBLOCK        =  WSAEWOULDBLOCK;
 564   EINPROGRESS        =  WSAEINPROGRESS;
 565   EALREADY           =  WSAEALREADY;
 566   ENOTSOCK           =  WSAENOTSOCK;
 567   EDESTADDRREQ       =  WSAEDESTADDRREQ;
 568   EMSGSIZE           =  WSAEMSGSIZE;
 569   EPROTOTYPE         =  WSAEPROTOTYPE;
 570   ENOPROTOOPT        =  WSAENOPROTOOPT;
 571   EPROTONOSUPPORT    =  WSAEPROTONOSUPPORT;
 572   ESOCKTNOSUPPORT    =  WSAESOCKTNOSUPPORT;
 573   EOPNOTSUPP         =  WSAEOPNOTSUPP;
 574   EPFNOSUPPORT       =  WSAEPFNOSUPPORT;
 575   EAFNOSUPPORT       =  WSAEAFNOSUPPORT;
 576   EADDRINUSE         =  WSAEADDRINUSE;
 577   EADDRNOTAVAIL      =  WSAEADDRNOTAVAIL;
 578   ENETDOWN           =  WSAENETDOWN;
 579   ENETUNREACH        =  WSAENETUNREACH;
 580   ENETRESET          =  WSAENETRESET;
 581   ECONNABORTED       =  WSAECONNABORTED;
 582   ECONNRESET         =  WSAECONNRESET;
 583   ENOBUFS            =  WSAENOBUFS;
 584   EISCONN            =  WSAEISCONN;
 585   ENOTCONN           =  WSAENOTCONN;
 586   ESHUTDOWN          =  WSAESHUTDOWN;
 587   ETOOMANYREFS       =  WSAETOOMANYREFS;
 588   ETIMEDOUT          =  WSAETIMEDOUT;
 589   ECONNREFUSED       =  WSAECONNREFUSED;
 590   ELOOP              =  WSAELOOP;
 591   ENAMETOOLONG       =  WSAENAMETOOLONG;
 592   EHOSTDOWN          =  WSAEHOSTDOWN;
 593   EHOSTUNREACH       =  WSAEHOSTUNREACH;
 594   ENOTEMPTY          =  WSAENOTEMPTY;
 595   EPROCLIM           =  WSAEPROCLIM;
 596   EUSERS             =  WSAEUSERS;
 597   EDQUOT             =  WSAEDQUOT;
 598   ESTALE             =  WSAESTALE;
 599   EREMOTE            =  WSAEREMOTE;
 600 
 601 { AHS }
 602 { WinSock 2 extension -- new error codes and type definition }
 603 
 604 type
 605   WSAEVENT                = THANDLE;
 606   LPHANDLE                = PHANDLE;
 607   LPWSAEVENT              = LPHANDLE;
 608   WSAOVERLAPPED           = TOVERLAPPED;
 609   LPWSAOVERLAPPED         = POverlapped;
 610 
 611 const
 612 
 613   WSA_IO_PENDING          = ERROR_IO_PENDING;
 614   WSA_IO_INCOMPLETE       = ERROR_IO_INCOMPLETE;
 615   WSA_INVALID_HANDLE      = ERROR_INVALID_HANDLE;
 616   WSA_INVALID_PARAMETER   = ERROR_INVALID_PARAMETER;
 617   WSA_NOT_ENOUGH_MEMORY   = ERROR_NOT_ENOUGH_MEMORY;
 618   WSA_OPERATION_ABORTED   = ERROR_OPERATION_ABORTED;
 619 
 620   WSA_INVALID_EVENT       = WSAEVENT(NiL);
 621   WSA_MAXIMUM_WAIT_EVENTS = MAXIMUM_WAIT_OBJECTS;
 622   WSA_WAIT_FAILED         = DWORD($FFFFFFFF); { ahs }
 623   WSA_WAIT_EVENT_0        = WAIT_OBJECT_0;
 624   WSA_WAIT_IO_COMPLETION  = WAIT_IO_COMPLETION;
 625   WSA_WAIT_TIMEOUT        = WAIT_TIMEOUT;
 626   WSA_INFINITE            = INFINITE;
 627 
 628 
 629 { WinSock 2 extension -- WSABUF and QOS struct }
 630 
 631 type
 632 
 633 PWSABUF = ^TWSABUF;
 634 TWSABUF = packed record
 635   len                : u_long;     { the length of the buffer }
 636   buf                : Pointer; //PChar;     { the pointer to the buffer }
 637 end;
 638 
 639 GUARANTEE = (
 640     BestEffortService,
 641     ControlledLoadService,
 642     PredictiveService,
 643     GuaranteedDelayService,
 644     GuaranteedService
 645 );
 646 
 647 PFlowspec = ^TFlowspec;
 648 TFlowspec = packed record
 649   TokenRate             : LongInt;        { In Bytes/sec }
 650   TokenBucketSize       : LongInt;        { In Bytes }
 651   PeakBandwidth         : LongInt;        { In Bytes/sec }
 652   Latency               : LongInt;        { In microseconds }
 653   DelayVariation        : LongInt;        { In microseconds }
 654   LevelOfGuarantee      : Guarantee;      { Guaranteed, Predictive }
 655                                           { or Best Effort       }
 656   CostOfCall            : LongInt;        { Reserved for future use, }
 657                                           { must be set to 0 now   }
 658   NetworkAvailability   : LongInt;        { read-only:         }
 659                                           {   1 if accessible, }
 660                                           {   0 if not         }
 661 end;
 662 
 663 PQOS = ^TQualityOfService;
 664 TQualityOfService = packed record
 665   SendingFlowspec       :TFlowspec;    { the flow spec for data sending }
 666   ReceivingFlowspec     :TFlowspec;    { the flow spec for data receiving }
 667   ProviderSpecific      :TWSABuf;      { additional provider specific stuff }
 668 end;
 669 
 670 const
 671 
 672 { WinSock 2 extension -- manifest constants for return values of the
 673   condition function}
 674 
 675   CF_ACCEPT       = $0000;
 676   CF_REJECT       = $0001;
 677   CF_DEFER        = $0002;
 678 
 679 {WinSock 2 extension -- manifest constants for shutdown() }
 680 
 681   SD_RECEIVE      = $00;
 682   SD_SEND         = $01;
 683   SD_BOTH         = $02;
 684 
 685 { WinSock 2 extension -- data type and manifest constants for socket groups }
 686 type
 687 
 688   TGroup            = u_int;
 689   PGroup           = ^TGroup;
 690 
 691 const
 692   
 693   SG_UNCONSTRAINED_GROUP   = $01;
 694   SG_CONSTRAINED_GROUP     = $02;
 695 
 696 { WinSock 2 extension -- data type for WSAEnumNetworkEvents() }
 697 
 698 type
 699 
 700 PWSANETWORKEVENTS = ^TWSANETWORKEVENTS;
 701 TWSANETWORKEVENTS = packed record
 702   lNetworkEvents           :u_long;
 703   iErrorCode               : array [0..FD_MAX_EVENTS-1] of u_int;
 704 end;
 705 
 706 {WinSock 2 extension -- WSAPROTOCOL_INFO structure and associated
 707  manifest constants}
 708 
 709 PGUID = ^TGUID;
 710 TGUID = packed record
 711   Data1              :u_long;
 712   Data2              :u_short;
 713   Data3              :u_short;
 714   Data4              : array [0..8-1] of u_char;
 715 end;
 716 
 717 const
 718 
 719   MAX_PROTOCOL_CHAIN  = 7;
 720 
 721   BASE_PROTOCOL       = 1;
 722   LAYERED_PROTOCOL    = 0;
 723 
 724 type
 725 
 726 PWSAPROTOCOLCHAIN = ^TWSAPROTOCOLCHAIN;
 727 TWSAPROTOCOLCHAIN = packed record
 728   ChainLen        : Integer;            { the length of the chain,     }
 729                                         { length = 0 means layered protocol, }
 730                                         { length = 1 means base protocol, }
 731                                         { length > 1 means protocol chain }
 732   ChainEntries : array[0..MAX_PROTOCOL_CHAIN-1] of DWORD; { a list of dwCatalogEntryIds }
 733 end;
 734 
 735 const
 736 
 737   WSAPROTOCOL_LEN    = 255;
 738 
 739 type
 740   
 741 PWSAPROTOCOL_INFOA = ^TWSAPROTOCOL_INFOA;
 742 TWSAPROTOCOL_INFOA = packed record
 743   dwServiceFlags1           : DWORD;
 744   dwServiceFlags2           : DWORD;
 745   dwServiceFlags3           : DWORD;
 746   dwServiceFlags4           : DWORD;
 747   dwProviderFlags           : DWORD;
 748   ProviderId                : TGUID;
 749   dwCatalogEntryId          : DWORD;
 750   ProtocolChain             : TWSAPROTOCOLCHAIN;
 751   iVersion                  : u_int;
 752   iAddressFamily            : u_int;
 753   iMaxSockAddr              : u_int;
 754   iMinSockAddr              : u_int;
 755   iSocketType               : u_int;
 756   iProtocol                 : u_int;
 757   iProtocolMaxOffset        : u_int;
 758   iNetworkByteOrder         : u_int;
 759   iSecurityScheme           : u_int;
 760   dwMessageSize            : DWORD;
 761   dwProviderReserved       : DWORD;
 762   szProtocol               : array [0..WSAPROTOCOL_LEN+1-1] of u_char;
 763 end;
 764 
 765 PWSAPROTOCOL_INFOW = ^TWSAPROTOCOL_INFOW;
 766 TWSAPROTOCOL_INFOW = packed record
 767   dwServiceFlags1           : DWORD;
 768   dwServiceFlags2           : DWORD;
 769   dwServiceFlags3           : DWORD;
 770   dwServiceFlags4           : DWORD;
 771   dwProviderFlags           : DWORD;
 772   ProviderId                : TGUID;
 773   dwCatalogEntryId          : DWORD;
 774   ProtocolChain             : TWSAPROTOCOLCHAIN;
 775   iVersion                  : u_int;
 776   iAddressFamily            : u_int;
 777   iMaxSockAddr              : u_int;
 778   iMinSockAddr              : u_int;
 779   iSocketType               : u_int;
 780   iProtocol                 : u_int;
 781   iProtocolMaxOffset        : u_int;
 782   iNetworkByteOrder         : u_int;
 783   iSecurityScheme           : u_int;
 784   dwMessageSize            : DWORD;
 785   dwProviderReserved       : DWORD;
 786   szProtocol               : array [0..WSAPROTOCOL_LEN+1-1] of WCHAR;
 787 end;
 788 
 789 {$ifdef UNICODE}
 790 
 791 TWSAPROTOCOL_INFO   = TWSAPROTOCOL_INFOW ;
 792 PWSAPROTOCOL_INFO =  PWSAPROTOCOL_INFOW ;
 793 
 794 {$else}
 795 
 796 TWSAPROTOCOL_INFO   = TWSAPROTOCOL_INFOA ;
 797 PWSAPROTOCOL_INFO =  PWSAPROTOCOL_INFOA ;
 798 
 799 {$endif UNICODE}
 800 
 801 const
 802 { Flag bit definitions for dwProviderFlags }
 803 
 804   PFL_MULTIPLE_PROTO_ENTRIES          =$00000001;
 805   PFL_RECOMMENDED_PROTO_ENTRY         =$00000002;
 806   PFL_HIDDEN                          =$00000004;
 807   PFL_MATCHES_PROTOCOL_ZERO           =$00000008;
 808 
 809 { Flag bit definitions for dwServiceFlags1 }
 810   XP1_CONNECTIONLESS                  =$00000001;
 811   XP1_GUARANTEED_DELIVERY             =$00000002;
 812   XP1_GUARANTEED_ORDER                =$00000004;
 813   XP1_MESSAGE_ORIENTED                =$00000008;
 814   XP1_PSEUDO_STREAM                   =$00000010;
 815   XP1_GRACEFUL_CLOSE                  =$00000020;
 816   XP1_EXPEDITED_DATA                  =$00000040;
 817   XP1_CONNECT_DATA                    =$00000080;
 818   XP1_DISCONNECT_DATA                 =$00000100;
 819   XP1_SUPPORT_BROADCAST               =$00000200;
 820   XP1_SUPPORT_MULTIPOINT              =$00000400;
 821   XP1_MULTIPOINT_CONTROL_PLANE        =$00000800;
 822   XP1_MULTIPOINT_DATA_PLANE           =$00001000;
 823   XP1_QOS_SUPPORTED                   =$00002000;
 824   XP1_INTERRUPT                       =$00004000;
 825   XP1_UNI_SEND                        =$00008000;
 826   XP1_UNI_RECV                        =$00010000;
 827   XP1_IFS_HANDLES                     =$00020000;
 828   XP1_PARTIAL_MESSAGE                 =$00040000;
 829 
 830   BIGENDIAN                           =$0000;
 831   LITTLEENDIAN                        =$0001;
 832 
 833   SECURITY_PROTOCOL_NONE              =$0000;
 834 
 835 { WinSock 2 extension -- manifest constants for WSAJoinLeaf() }
 836 
 837   JL_SENDER_ONLY    =$01;
 838   JL_RECEIVER_ONLY  =$02;
 839   JL_BOTH           =$04;
 840 
 841 { WinSock 2 extension -- manifest constants for WSASocket() }
 842 
 843   WSA_FLAG_OVERLAPPED           =$01;
 844   WSA_FLAG_MULTIPOINT_C_ROOT    =$02;
 845   WSA_FLAG_MULTIPOINT_C_LEAF    =$04;
 846   WSA_FLAG_MULTIPOINT_D_ROOT    =$08;
 847   WSA_FLAG_MULTIPOINT_D_LEAF    =$10;
 848 
 849 { WinSock 2 extension -- manifest constants for WSAIoctl() }
 850 
 851   IOC_UNIX                      =$00000000;
 852   IOC_WS2                       =$08000000;
 853   IOC_PROTOCOL                  =$10000000;
 854   IOC_VENDOR                    =$18000000;
 855 
 856   SIO_ASSOCIATE_HANDLE           = IOC_IN or IOC_WS2 or 1;
 857   SIO_ENABLE_CIRCULAR_QUEUEING   = IOC_VOID or IOC_WS2 or 2;
 858   SIO_FIND_ROUTE                 = IOC_OUT or IOC_WS2 or 3;
 859   SIO_FLUSH                      = IOC_VOID or IOC_WS2 or 4;
 860   SIO_GET_BROADCAST_ADDRESS      = IOC_OUT or IOC_WS2 or 5;
 861   SIO_GET_EXTENSION_FUNCTION_POINTER  = IOC_INOUT or IOC_WS2 or 6;
 862   SIO_GET_QOS                    = IOC_INOUT or IOC_WS2 or 7;
 863   SIO_GET_GROUP_QOS              = IOC_INOUT or IOC_WS2 or 8;
 864   SIO_MULTIPOINT_LOOPBACK        = IOC_IN or IOC_WS2 or 9;
 865   SIO_MULTICAST_SCOPE            = IOC_IN or IOC_WS2 or 10;
 866   SIO_SET_QOS                    = IOC_IN or IOC_WS2 or 11;
 867   SIO_SET_GROUP_QOS              = IOC_IN or IOC_WS2 or 12;
 868   SIO_TRANSLATE_HANDLE           = IOC_INOUT or IOC_WS2 or 13;
 869 
 870 { WinSock 2 extension -- manifest constants for SIO_TRANSLATE_HANDLE ioctl }
 871 
 872   TH_NETDEV        = $00000001;
 873   TH_TAPI          = $00000002;
 874 
 875 {  Microsoft Windows Extended data types required for the functions to
 876    convert   back  and  forth  between  binary  and  string  forms  of
 877    addresses. }
 878 
 879 type
 880 
 881   SOCKADDR     = TSockAddr; { AHS ?}
 882 {  PSOCKADDR    = PSockaddr;}
 883   LPSOCKADDR   = PSockaddr;
 884 
 885 { Manifest constants and type definitions related to name resolution and
 886   registration (RNR) API }
 887 
 888 PBLOB = ^TBLOB;
 889 TBLOB = packed record
 890     cbSize    :ULONG;
 891     pBlobData :^byte;
 892 end;
 893 
 894 { Service Install Flags }
 895 
 896 const
 897 
 898   SERVICE_MULTIPLE       =$00000001;
 899 
 900 { Name Spaces }
 901 
 902   NS_ALL                      = 0;
 903 
 904   NS_SAP                      = 1;
 905   NS_NDS                      = 2;
 906   NS_PEER_BROWSE              = 3;
 907 
 908   NS_TCPIP_LOCAL              = 10;
 909   NS_TCPIP_HOSTS              = 11;
 910   NS_DNS                      = 12;
 911   NS_NETBT                    = 13;
 912   NS_WINS                     = 14;
 913 
 914   NS_NBP                      = 20;
 915 
 916   NS_MS                       = 30;
 917   NS_STDA                     = 31;
 918   NS_NTDS                     = 32;
 919 
 920   NS_X500                     = 40;
 921   NS_NIS                      = 41;
 922   NS_NISPLUS                  = 42;
 923 
 924   NS_WRQ                      = 50;
 925 
 926 
 927 {  Resolution flags for WSAGetAddressByName().
 928    Note these are also used by the 1.1 API GetAddressByName, so
 929    leave them around. }
 930 
 931   RES_UNUSED_1                =$00000001;
 932   RES_FLUSH_CACHE             =$00000002;
 933   RES_SERVICE                 =$00000004;
 934 
 935 
 936 { Well known value names for Service Types }
 937 
 938   SERVICE_TYPE_VALUE_IPXPORTA     ='IpxSocket';
 939   SERVICE_TYPE_VALUE_IPXPORTW     = 'IpxSocket';
 940   SERVICE_TYPE_VALUE_SAPIDA       = 'SapId';
 941   SERVICE_TYPE_VALUE_SAPIDW       ='SapId';
 942 
 943   SERVICE_TYPE_VALUE_TCPPORTA     = 'TcpPort';
 944   SERVICE_TYPE_VALUE_TCPPORTW     ='TcpPort';
 945 
 946   SERVICE_TYPE_VALUE_UDPPORTA     = 'UdpPort';
 947   SERVICE_TYPE_VALUE_UDPPORTW     ='UdpPort';
 948 
 949   SERVICE_TYPE_VALUE_OBJECTIDA    = 'ObjectId';
 950   SERVICE_TYPE_VALUE_OBJECTIDW    ='ObjectId';
 951 
 952 {$ifdef UNICODE}
 953 
 954   SERVICE_TYPE_VALUE_SAPID        =SERVICE_TYPE_VALUE_SAPIDW;
 955   SERVICE_TYPE_VALUE_TCPPORT      =SERVICE_TYPE_VALUE_TCPPORTW;
 956   SERVICE_TYPE_VALUE_UDPPORT      =SERVICE_TYPE_VALUE_UDPPORTW;
 957   SERVICE_TYPE_VALUE_OBJECTID     =SERVICE_TYPE_VALUE_OBJECTIDW;
 958 
 959 {$else} { not UNICODE }
 960 
 961   SERVICE_TYPE_VALUE_SAPID        =SERVICE_TYPE_VALUE_SAPIDA;
 962   SERVICE_TYPE_VALUE_TCPPORT      =SERVICE_TYPE_VALUE_TCPPORTA;
 963   SERVICE_TYPE_VALUE_UDPPORT      =SERVICE_TYPE_VALUE_UDPPORTA;
 964   SERVICE_TYPE_VALUE_OBJECTID     =SERVICE_TYPE_VALUE_OBJECTIDA;
 965 
 966 {$endif}
 967 
 968 { SockAddr Information }
 969 type
 970 
 971 PSOCKET_ADDRESS = ^TSOCKET_ADDRESS;
 972 TSOCKET_ADDRESS = packed record
 973     lpSockaddr        :  PSOCKADDR ;
 974     iSockaddrLength   : u_int;
 975 end;
 976 
 977 { CSAddr Information }
 978 
 979 PCSADDR_INFO = ^TCSADDR_INFO;
 980 TCSADDR_INFO = packed record
 981     LocalAddr         :TSOCKET_ADDRESS;
 982     RemoteAddr        :TSOCKET_ADDRESS;
 983     iSocketType       :u_int;
 984     iProtocol         :u_int;
 985 end;
 986 
 987 
 988 { Address Family/Protocol Tuples }
 989 
 990 PAFPROTOCOLS = ^TAFPROTOCOLS;
 991 TAFPROTOCOLS = packed record
 992   iAddressFamily      :u_int;
 993   iProtocol           :u_int;
 994 end;
 995 
 996 { Client Query API Typedefs }
 997 
 998 { The comparators }
 999 
1000 PWSAEcomparator = ^TWSAEcomparator;
1001 TWSAEcomparator = (
1002     COMP_EQUAL,
1003     COMP_NOTLESS
1004 );
1005 
1006 PWSAVersion = ^TWSAVersion;
1007 TWSAVersion = packed record
1008     dwVersion        : Dword;
1009     ecHow            : TWSAEComparator;
1010 end;
1011 
1012 PWSAQuerySetA = ^TWSAQuerySetA;
1013 TWSAQuerySetA = packed record
1014     dwSize                  : DWord;
1015     lpszServiceInstanceName : PChar;
1016     lpServiceClassId        : PGUID;
1017     lpVersion               : PWSAVERSION;
1018     lpszComment             : PChar;
1019     dwNameSpace             : DWord;
1020     lpNSProviderId          : PGUID;
1021     lpszContext             : PChar;
1022     dwNumberOfProtocols     : DWORD;
1023     lpafpProtocols          : PAFPROTOCOLS;
1024     lpszQueryString         : PChar;
1025     dwNumberOfCsAddrs       : Dword;
1026     lpcsaBuffer             : PCSADDR_INFO;
1027     dwOutputFlags           : DWord;
1028     lpBlob                  : PBLOB;
1029 end;
1030 
1031 PWSAQuerySetW = ^TWSAQuerySetW;
1032 TWSAQuerySetW = packed record
1033     dwSize                  : DWord;
1034     lpszServiceInstanceName : PWideChar;                        //MIO, antes WideChar
1035     lpServiceClassId        : PGUID;
1036     lpVersion               : PWSAVERSION;
1037     lpszComment             : PWideChar;                         //MIO, antes WideChar
1038     dwNameSpace             : DWord;
1039     lpNSProviderId          : PGUID;
1040     lpszContext             : PWideChar;                         //MIO, antes WideChar
1041     dwNumberOfProtocols     : DWORD;
1042     lpafpProtocols          : PAFPROTOCOLS;
1043     lpszQueryString         : PWideChar;                        //MIO, antes WideChar
1044     dwNumberOfCsAddrs       : Dword;
1045     lpcsaBuffer             : PCSADDR_INFO;
1046     dwOutputFlags           : DWord;
1047     lpBlob                  : PBLOB;
1048 end;
1049 
1050 {$ifdef UNICODE}
1051 
1052   WSAQUERYSET              = TWSAQUERYSETW;
1053   PWSAQUERYSET             = PWSAQUERYSETW;
1054 
1055 {$else}
1056 
1057   WSAQUERYSET              = TWSAQUERYSETA;
1058   PWSAQUERYSET             = PWSAQUERYSETA;
1059 
1060 {$endif }
1061 
1062 const
1063 
1064   LUP_DEEP                = $0001;
1065   LUP_CONTAINERS          = $0002;
1066   LUP_NOCONTAINERS        = $0004;
1067   LUP_NEAREST             = $0008;
1068   LUP_RETURN_NAME         = $0010;
1069   LUP_RETURN_TYPE         = $0020;
1070   LUP_RETURN_VERSION      = $0040;
1071   LUP_RETURN_COMMENT      = $0080;
1072   LUP_RETURN_ADDR         = $0100;
1073   LUP_RETURN_BLOB         = $0200;
1074   LUP_RETURN_ALIASES      = $0400;
1075   LUP_RETURN_QUERY_STRING = $0800;
1076   LUP_RETURN_ALL          = $0FF0;
1077   LUP_RES_SERVICE         = $8000;
1078 
1079   LUP_FLUSHCACHE       = $1000;
1080   LUP_FLUSHPREVIOUS    = $2000;
1081 
1082 
1083 { Return flags }
1084 
1085   RESULT_IS_ALIAS      = $0001;
1086 
1087 { Service Address Registration and Deregistration Data Types. }
1088 
1089 type
1090 
1091 PWSAESETSERVICEOP = ^TWSAESETSERVICEOP;
1092 TWSAESETSERVICEOP = (
1093     RNRSERVICE_REGISTER,
1094     RNRSERVICE_DEREGISTER,
1095     RNRSERVICE_DELETE
1096 );
1097 
1098 { Service Installation/Removal Data Types. }
1099 
1100 PWSANSClassInfoA = ^TWSANSClassInfoA;
1101 TWSANSClassInfoA = packed record
1102   lpszName         : PChar;
1103   dwNameSpace      : Dword;
1104   dwValueType      : Dword;
1105   dwValueSize      : Dword;
1106   lpValue          : Pointer;
1107  end;
1108 
1109 PWSANSClassInfoW = ^TWSANSClassInfoW;
1110 TWSANSClassInfoW = packed record
1111   lpszName         : WideChar;
1112   dwNameSpace      : Dword;
1113   dwValueType      : Dword;
1114   dwValueSize      : Dword;
1115   lpValue          : Pointer;
1116  end;
1117 
1118 {$ifdef UNICODE }
1119 
1120   TWSANSCLASSINFO   = TWSANSCLASSINFOW;
1121   PWSANSCLASSINFO  = PWSANSCLASSINFOW;
1122 
1123 {$else}
1124 
1125   TWSANSCLASSINFO   = TWSANSCLASSINFOA;
1126   PWSANSCLASSINFO  = PWSANSCLASSINFOA;
1127 
1128 {$endif  UNICODE}
1129 
1130 PWSAServiceClassInfoA = ^TWSAServiceClassInfoA;
1131 TWSAServiceClassInfoA = packed record
1132     lpServiceClassId      : PGUID;
1133     lpszServiceClassName  : PChar;
1134     dwCount               : DWord;
1135     lpClassInfos          : PWSANSCLASSINFOA;
1136 end;
1137 
1138 PWSAServiceClassInfoW = ^TWSAServiceClassInfoW;
1139 TWSAServiceClassInfoW = packed record
1140     lpServiceClassId      : PGUID;
1141     lpszServiceClassName  : WideChar;
1142     dwCount               : DWord;
1143     lpClassInfos          : PWSANSCLASSINFOW;
1144 end;
1145 
1146 {$ifdef UNICODE}
1147 
1148   TWSASERVICECLASSINFO         = TWSASERVICECLASSINFOW;
1149   PWSASERVICECLASSINFO        = PWSASERVICECLASSINFOW;
1150 
1151 {$else}
1152 
1153   TWSASERVICECLASSINFO         = TWSASERVICECLASSINFOA;
1154   PWSASERVICECLASSINFO        = PWSASERVICECLASSINFOA;
1155 
1156 {$endif  UNICODE}
1157 
1158 PWSANAMESPACE_INFOA = ^TWSANAMESPACE_INFOA;
1159 TWSANAMESPACE_INFOA = packed record
1160     NSProviderId      : TGUID;
1161     dwNameSpace       : DWord;
1162     fActive           : BOOL;
1163     dwVersion         : DWord;
1164     lpszIdentifier    : PChar;
1165 end;
1166 
1167 PWSANAMESPACE_INFOW = ^TWSANAMESPACE_INFOW;
1168 TWSANAMESPACE_INFOW = packed record
1169     NSProviderId      : TGUID;
1170     dwNameSpace       : DWord;
1171     fActive           : BOOL;
1172     dwVersion         : DWord;
1173     lpszIdentifier    : WideChar;
1174 end;
1175 
1176 {$ifdef UNICODE}
1177 
1178   TWSANAMESPACE_INFO     = TWSANAMESPACE_INFOW;
1179   PWSANAMESPACE_INFO     = PWSANAMESPACE_INFOW;
1180 
1181 {$else}
1182 
1183   TWSANAMESPACE_INFO     = TWSANAMESPACE_INFOA;
1184   PWSANAMESPACE_INFO     = PWSANAMESPACE_INFOA;
1185 
1186 {$endif  UNICODE}
1187 
1188 { AHS END }
1189 
1190 { Socket function prototypes }
1191 
1192 // Using "var addr:TSockAddr" in accept makes impossible to compile for IPv6
1193 function accept(s: TSocket; addr: PSockAddr; var addrlen: Integer): TSocket; stdcall;
1194 // Using "var addr:TSockAddr" in bind makes impossible to compile for IPv6
1195 function bind(s: TSocket; addr: PSockAddr; namelen: Integer): Integer; stdcall;
1196 function closesocket(s: TSocket): Integer; stdcall;
1197 // Using "var addr:TSockAddr" in connect makes impossible to compile for IPv6
1198 function connect(s: TSocket; name: PSockAddr; namelen: Integer): Integer; stdcall;
1199 function ioctlsocket(s: TSocket; cmd: Longint; var arg: u_long): Integer; stdcall;
1200 function getpeername(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
1201 // Using "var addr:TSockAddr" in getsockname makes impossible to compile for IPv6
1202 function getsockname(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; stdcall;
1203 function getsockopt(s: TSocket; level, optname: Integer; optval: PChar; var optlen: Integer): Integer; stdcall;
1204 function htonl(hostlong: u_long): u_long; stdcall;
1205 function htons(hostshort: u_short): u_short; stdcall;
1206 function inet_addr(cp: PChar): u_long; stdcall; {PInAddr;}  { TInAddr }
1207 function inet_ntoa(inaddr: TInAddr): PChar; stdcall;
1208 function listen(s: TSocket; backlog: Integer): Integer; stdcall;
1209 function ntohl(netlong: u_long): u_long; stdcall;
1210 function ntohs(netshort: u_short): u_short; stdcall;
1211 function recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
1212 // Using "var from: TSockAddr" in recvfrom makes impossible to compile for IPv6
1213 function recvfrom(s: TSocket; var Buf; len, flags: Integer;
1214   from: PSockAddr; var fromlen: Integer): Integer; stdcall;
1215 function select(nfds: Integer; readfds, writefds, exceptfds: PFDSet;
1216   timeout: PTimeVal): Longint; stdcall;
1217 function send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
1218 // Using "var addrto: TSockAddr" in sendto makes impossible to compile for IPv6
1219 function sendto(s: TSocket; var Buf; len, flags: Integer; addrto: PSockAddr;
1220   tolen: Integer): Integer; stdcall;
1221 function setsockopt(s: TSocket; level, optname: Integer; optval: PChar;
1222   optlen: Integer): Integer; stdcall;
1223 function shutdown(s: TSocket; how: Integer): Integer; stdcall;
1224 function socket(af, struct, protocol: Integer): TSocket; stdcall;
1225 function gethostbyaddr(addr: Pointer; len, struct: Integer): PHostEnt; stdcall;
1226 function gethostbyname(name: PChar): PHostEnt; stdcall;
1227 function gethostname(name: PChar; len: Integer): Integer; stdcall;
1228 function getservbyport(port: Integer; proto: PChar): PServEnt; stdcall;
1229 function getservbyname(name, proto: PChar): PServEnt; stdcall;
1230 function getprotobynumber(proto: Integer): PProtoEnt; stdcall;
1231 function getprotobyname(name: PChar): PProtoEnt; stdcall;
1232 function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer; stdcall;
1233 function WSACleanup: Integer; stdcall;
1234 procedure WSASetLastError(iError: Integer); stdcall;
1235 function WSAGetLastError: Integer; stdcall;
1236 function WSAIsBlocking: BOOL; stdcall;
1237 function WSAUnhookBlockingHook: Integer; stdcall;
1238 function WSASetBlockingHook(lpBlockFunc: TFarProc): TFarProc; stdcall;
1239 function WSACancelBlockingCall: Integer; stdcall;
1240 function WSAAsyncGetServByName(HWindow: HWND; wMsg: u_int;
1241   name, proto, buf: PChar; buflen: Integer): THandle; stdcall;
1242 function WSAAsyncGetServByPort( HWindow: HWND; wMsg, port: u_int;
1243   proto, buf: PChar; buflen: Integer): THandle; stdcall;
1244 function WSAAsyncGetProtoByName(HWindow: HWND; wMsg: u_int;
1245   name, buf: PChar; buflen: Integer): THandle; stdcall;
1246 function WSAAsyncGetProtoByNumber(HWindow: HWND; wMsg: u_int; number: Integer;
1247   buf: PChar; buflen: Integer): THandle; stdcall;
1248 function WSAAsyncGetHostByName(HWindow: HWND; wMsg: u_int;
1249   name, buf: PChar; buflen: Integer): THandle; stdcall;
1250 function WSAAsyncGetHostByAddr(HWindow: HWND; wMsg: u_int; addr: PChar;
1251   len, struct: Integer; buf: PChar; buflen: Integer): THandle; stdcall;
1252 function WSACancelAsyncRequest(hAsyncTaskHandle: THandle): Integer; stdcall;
1253 function WSAAsyncSelect(s: TSocket; HWindow: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
1254 
1255 { WinSock 2 extensions -- data types for the condition function in
1256   WSAAccept() and overlapped I/O completion routine. }
1257 
1258 type
1259 
1260 PCONDITIONPROC = function ( lpCallerId:PWSABUF; lpCallerData:PWSABUF;
1261     lpSQOS:PQOS; lpGQOS:PQOS; lpCalleeId:PWSABUF;lpCalleeData:PWSABUF;
1262     g:PGroup; dwCallbackData:DWord) :u_int; stdcall;
1263 
1264 PWSAOVERLAPPED_COMPLETION_ROUTINE = procedure ( dwError :Dword;
1265     cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: Dword
1266     ); stdcall;
1267 
1268 { WinSock 2 API new function prototypes }
1269 
1270 function WSAAccept( s: TSOCKET; addr: psockaddr; addrlen: PINT;
1271     lpfnCondition: PCONDITIONPROC; dwCallbackData: DWORD): TSOCKET; stdcall;
1272 function WSACloseEvent( hEvent: WSAEVENT ):BOOL; stdcall;
1273 function WSAConnect(s: TSOCKET; name: psockaddr;namelen: u_int;
1274     lpCallerData: PWSABUF; lpCalleeData: PWSABUF; lpSQOS: PQOS;
1275     lpGQOS: PQOS) : u_int; stdcall;
1276 function WSACreateEvent:WSAEVENT; stdcall;
1277 
1278 {$IFDEF UNICODE}
1279 function WSADuplicateSocket(s: TSocket; dwProcessId: DWORD;
1280    lpProtocolInfo: PWSAPROTOCOL_INFOW): u_int; stdcall;
1281 {$ELSE}
1282 function WSADuplicateSocket(s: TSocket; dwProcessId: DWORD;
1283    lpProtocolInfo: PWSAPROTOCOL_INFOA): u_int; stdcall;
1284 {$ENDIF} {UNICODE}
1285 
1286 function WSAEnumNetworkEvents( s: TSocket; hEventObject: WSAEVENT;
1287    lpNetworkEvents: PWSANETWORKEVENTS): u_int; stdcall;
1288 
1289 {$IFDEF UNICODE}
1290 function WSAEnumProtocols( lpiProtocols: PInt;
1291    lpProtocolBuffer: PWSAPROTOCOL_INFOW; lpdwBufferLength: PDWORD
1292    ): u_int; stdcall;
1293 {$ELSE}
1294 function WSAEnumProtocols( lpiProtocols: PInt;
1295    lpProtocolBuffer: PWSAPROTOCOL_INFOA; lpdwBufferLength: PDWORD
1296    ): u_int; stdcall;
1297 {$ENDIF} {UNICODE}
1298 
1299 function WSAEventSelect(s: TSOCKET; hEventObject: WSAEVENT;
1300     lNetworkEvents: u_long): u_int; stdcall;
1301 function WSAGetOverlappedResult( s: TSocket; lpOverlapped: LPWSAOVERLAPPED;
1302     lpcbTransfer: PDWORD; fWait: BOOL; lpdwFlags: PDWORD): BOOL; stdcall;
1303 function WSAGetQOSByName( s: TSocket; lpQOSName: PWSABUF;
1304     lpQOS: PQOS): BOOL; stdcall;
1305 function WSAHtonl( s: TSocket; hostlong: u_long; lpnetlong: pu_long)
1306     : u_int; stdcall;
1307 function WSAHtons( s: TSocket; hostshort: u_short; lpnetshort: pu_short)
1308     : u_int; stdcall;
1309 function WSAIoctl( s: TSocket; dwIoControlCode: DWORD; lpvInBuffer: Pointer;
1310     cbInBuffer: DWORD; lpvOutBuffer: Pointer; cbOutBuffer: DWORD;
1311     lpcbBytesReturned: PDWORD; lpOverlapped: LPWSAOVERLAPPED;
1312     lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_int; stdcall;
1313 function WSAJoinLeaf( s: TSocket; name: psockaddr; namelen: u_int;
1314     lpCallerData: PWSABUF; lpCalleeData: PWSABUF; lpSQOS: PQOS; lpGQOS: PQOS;
1315     dwFlags: DWORD): TSocket; stdcall;
1316 function WSANtohl( s: TSocket; netlong: u_long; lphostlong: pu_long)
1317     : u_int; stdcall;
1318 function WSANtohs( s: TSocket; netshort: u_short; lphostshort: pu_short)
1319     : u_int; stdcall;
1320 function WSARecv( s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
1321     lpNumberOfBytesRecvd: PDWORD; lpFlags: PDWORD;lpOverlapped: LPWSAOVERLAPPED;
1322     lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_int; stdcall;
1323 function WSARecvDisconnect( s: TSocket; lpInboundDisconnectData: PWSABUF)
1324     : u_int; stdcall;
1325 function WSARecvFrom( s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
1326     lpNumberOfBytesRecvd: PDWORD; lpFlags: PDWORD; lpFrom: psockaddr;
1327     lpFromlen: PInt; lpOverlapped: LPWSAOVERLAPPED;
1328     lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_int; stdcall;
1329 function WSAResetEvent( hEvent: WSAEVENT): BOOL; stdcall;
1330 function WSASend( s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
1331     lpNumberOfBytesSent: PDWORD; dwFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED;
1332     lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_int; stdcall;
1333 function WSASendDisconnect( s: TSocket; lpOutboundDisconnectData: PWSABUF)
1334     : u_int; stdcall;
1335 function WSASendTo(s: TSocket; lpBuffers: PWSABUF; dwBufferCount: DWORD;
1336     lpNumberOfBytesSent: PDWORD;dwFlags: DWORD; lpTo: psockaddr; iTolen: u_int;
1337     lpOverlapped: LPWSAOVERLAPPED;
1338     lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_int; stdcall;
1339 function WSASetEvent( hEvent: WSAEVENT): BOOL; stdcall;
1340 {$IFDEF UNICODE}
1341 function WSASocket( af: u_int; atype: u_int; protocol: u_int;
1342     lpProtocolInfo: PWSAPROTOCOL_INFOW; g: TGroup; dwFlags: Dword)
1343     : TSocket; stdcall;
1344 {$ELSE}
1345 function WSASocket( af: u_int; atype: u_int; protocol: u_int;
1346     lpProtocolInfo: PWSAPROTOCOL_INFOA; g: TGroup; dwFlags: Dword)
1347     : TSocket; stdcall;
1348 {$ENDIF} { UNICODE}
1349 function WSAWaitForMultipleEvents( cEvents: DWORD; lphEvents: LPWSAEVENT;
1350     fWaitAll: BOOL; dwTimeout: DWORD; fAlertable: BOOL): DWORD; stdcall;
1351 {$IFDEF UNICODE}
1352 function WSAAddressToString( lpsaAddress: PSOCKADDR; dwAddressLength: DWORD;
1353     lpProtocolInfo: PWSAPROTOCOL_INFOW; lpszAddressString: WideChar;
1354     lpdwAddressStringLength: PDWORD): u_int; stdcall;
1355 {$ELSE}
1356 function WSAAddressToString( lpsaAddress: PSOCKADDR; dwAddressLength: DWORD;
1357     lpProtocolInfo: PWSAPROTOCOL_INFOA; lpszAddressString: PChar;
1358     lpdwAddressStringLength: PDWORD): u_int; stdcall;
1359 {$ENDIF} { UNICODE}
1360 
1361 {$IFDEF UNICODE}
1362 function WSAStringToAddress( AddressString: WideChar; AddressFamily: u_int;
1363     lpProtocolInfo: PWSAPROTOCOL_INFOW; lpAddress: PSOCKADDR;
1364     lpAddressLength: PInt): u_int; stdcall;
1365 {$ELSE}
1366 function WSAStringToAddress( AddressString: PChar; AddressFamily: u_int;
1367     lpProtocolInfo: PWSAPROTOCOL_INFOA; lpAddress: PSOCKADDR;
1368     lpAddressLength: PInt): u_int; stdcall;
1369 {$ENDIF} { UNICODE}
1370 
1371 { Registration and Name Resolution API functions }
1372 
1373 {$IFDEF UNICODE}
1374 function WSALookupServiceBegin( lpqsRestrictions: PWSAQUERYSETW;
1375     dwControlFlags: DWORD; lphLookup: LPHANDLE): u_int; stdcall;
1376 {$ELSE}
1377 function WSALookupServiceBegin( lpqsRestrictions: PWSAQUERYSETA;
1378     dwControlFlags: DWORD; lphLookup: LPHANDLE): u_int; stdcall;
1379 {$ENDIF} { UNICODE}
1380 
1381 {$IFDEF UNICODE}
1382 function WSALookupServiceNext( hLookup: THANDLE; dwControlFlags: DWORD;
1383     lpdwBufferLength: PDWORD; lpqsResults: PWSAQUERYSETW): u_int; stdcall;
1384 {$ELSE}
1385 function WSALookupServiceNext( hLookup: THANDLE; dwControlFlags: DWORD;
1386     lpdwBufferLength: PDWORD; lpqsResults: PWSAQUERYSETA): LongInt; stdcall;
1387 {$ENDIF} { UNICODE}
1388 
1389 function WSALookupServiceEnd( hLookup: THandle): u_int; stdcall;
1390 
1391 {$IFDEF UNICODE}
1392 function WSAInstallServiceClass( lpServiceClassInfo: PWSASERVICECLASSINFOW
1393     ): u_int; stdcall;
1394 {$ELSE}
1395 function WSAInstallServiceClass( lpServiceClassInfo: PWSASERVICECLASSINFOA
1396     ): u_int; stdcall;
1397 {$ENDIF} { UNICODE}
1398 
1399 function WSARemoveServiceClass(lpServiceClassId: PGUID): u_int; stdcall;
1400 
1401 {$IFDEF UNICODE}
1402 function WSAGetServiceClassInfo( lpProviderId: PGUID; lpServiceClassId: PGUID;
1403     lpdwBufSize: PDWORD; lpServiceClassInfo: PWSASERVICECLASSINFOW)
1404     : u_int; stdcall;
1405 {$ELSE}
1406 function WSAGetServiceClassInfo( lpProviderId: PGUID; lpServiceClassId: PGUID;
1407     lpdwBufSize: PDWORD; lpServiceClassInfo: PWSASERVICECLASSINFOA)
1408     : u_int; stdcall;
1409 {$ENDIF} { UNICODE}
1410 
1411 {$IFDEF UNICODE}
1412 function WSAEnumNameSpaceProviders( lpdwBufferLength: PDWORD;
1413     lpnspBuffer: PWSANAMESPACE_INFOW):u_int; stdcall;
1414 {$ELSE}
1415 function WSAEnumNameSpaceProviders( lpdwBufferLength: PDWORD;
1416     lpnspBuffer: PWSANAMESPACE_INFOA):u_int; stdcall;
1417 {$ENDIF} { UNICODE}
1418 
1419 {$IFDEF UNICODE}
1420 function WSAGetServiceClassNameByClassId( lpServiceClassId: PGUID;
1421     lpszServiceClassName: WideChar; lpdwBufferLength: PDWORD): u_int; stdcall;
1422 {$ELSE}
1423 function WSAGetServiceClassNameByClassId( lpServiceClassId: PGUID;
1424     lpszServiceClassName: PChar; lpdwBufferLength: PDWORD): u_int; stdcall;
1425 {$ENDIF} { UNICODE}
1426 
1427 {$IFDEF UNICODE}
1428 function WSASetService( lpqsRegInfo: PWSAQUERYSETW;
1429     essoperation: TWSAESETSERVICEOP; dwControlFlags: DWORD):u_int; stdcall;
1430 {$ELSE}
1431 function WSASetService( lpqsRegInfo: PWSAQUERYSETA;
1432     essoperation: TWSAESETSERVICEOP; dwControlFlags: DWORD):u_int; stdcall;
1433 {$ENDIF} { UNICODE}
1434 
1435 function WSARecvEx(s: TSocket; var buf; len: Integer; var flags: Integer): Integer; stdcall;
1436 
1437 function TransmitFile(hSocket: TSocket; hFile: THandle; nNumberOfBytesToWrite: DWORD;
1438   nNumberOfBytesPerSend: DWORD; lpOverlapped: POverlapped;
1439   lpTransmitBuffers: PTransmitFileBuffers; dwReserved: DWORD): BOOL; stdcall;
1440 
1441 function WSAMakeASyncReply(Buflen, Error: Word): Longint;
1442 function WSAMakeSelectReply(Event, Error: Word): Longint;
1443 function WSAGetAsyncBuflen(Param: Longint): Word;
1444 function WSAGetAsyncError(Param: Longint): Word;
1445 function WSAGetSelectEvent(Param: Longint): Word;
1446 function WSAGetSelectError(Param: Longint): Word;
1447 
1448 implementation
1449 
1450 const
1451   winsocket = 'ws2_32.dll';
1452 
1453 function WSAMakeASyncReply;
1454 begin
1455   WSAMakeASyncReply:= MakeLong(Buflen, Error);
1456 end;
1457 
1458 function WSAMakeSelectReply;
1459 begin
1460   WSAMakeSelectReply:= MakeLong(Event, Error);
1461 end;
1462 
1463 function WSAGetAsyncBuflen;
1464 begin
1465   WSAGetAsyncBuflen:= LOWORD(Param);
1466 end;
1467 
1468 function WSAGetAsyncError;
1469 begin
1470   WSAGetAsyncError:= HIWORD(Param);
1471 end;
1472 
1473 function WSAGetSelectEvent;
1474 begin
1475   WSAGetSelectEvent:= LOWORD(Param);
1476 end;
1477 
1478 function WSAGetSelectError;
1479 begin
1480   WSAGetSelectError:= HIWORD(Param);
1481 end;
1482 
1483 function accept;
1484          external    winsocket name 'accept';
1485 function bind;
1486          external    winsocket name 'bind';
1487 function closesocket;
1488          external    winsocket name 'closesocket';
1489 function connect;
1490          external    winsocket name 'connect';
1491 function getpeername;
1492          external    winsocket name 'getpeername';
1493 function getsockname;
1494          external    winsocket name 'getsockname';
1495 function getsockopt;
1496          external    winsocket name 'getsockopt';
1497 function htonl;
1498          external    winsocket name 'htonl';
1499 function htons;
1500          external    winsocket name 'htons';
1501 function inet_addr;
1502          external    winsocket name 'inet_addr';
1503 function inet_ntoa;
1504          external    winsocket name 'inet_ntoa';
1505 function ioctlsocket;
1506          external    winsocket name 'ioctlsocket';
1507 function listen;
1508          external    winsocket name 'listen';
1509 function ntohl;
1510          external    winsocket name 'ntohl';
1511 function ntohs;
1512          external    winsocket name 'ntohs';
1513 function recv;
1514          external    winsocket name 'recv';
1515 function recvfrom;
1516          external    winsocket name 'recvfrom';
1517 function select;
1518          external    winsocket name 'select';
1519 function send;
1520          external    winsocket name 'send';
1521 function sendto;
1522          external    winsocket name 'sendto';
1523 function setsockopt;
1524          external    winsocket name 'setsockopt';
1525 function shutdown;
1526          external    winsocket name 'shutdown';
1527 function socket;
1528          external    winsocket name 'socket';
1529 
1530 function gethostbyaddr;
1531          external    winsocket name 'gethostbyaddr';
1532 function gethostbyname;
1533          external    winsocket name 'gethostbyname';
1534 function getprotobyname;
1535          external    winsocket name 'getprotobyname';
1536 function getprotobynumber;
1537          external    winsocket name 'getprotobynumber';
1538 function getservbyname;
1539          external    winsocket name 'getservbyname';
1540 function getservbyport;
1541          external    winsocket name 'getservbyport';
1542 function gethostname;
1543          external    winsocket name 'gethostname';
1544 
1545 function WSAAsyncSelect;
1546          external    winsocket name 'WSAAsyncSelect';
1547 function WSARecvEx;
1548          external    winsocket name 'WSARecvEx';
1549 function WSAAsyncGetHostByAddr;
1550          external winsocket name 'WSAAsyncGetHostByAddr';
1551 function WSAAsyncGetHostByName;
1552          external winsocket name 'WSAAsyncGetHostByName';
1553 function WSAAsyncGetProtoByNumber;
1554          external winsocket name 'WSAAsyncGetProtoByNumber';
1555 function WSAAsyncGetprotoByName;
1556          external winsocket name 'WSAAsyncGetprotoByName';
1557 function WSAAsyncGetServByPort;
1558          external winsocket name 'WSAAsyncGetServByPort';
1559 function WSAAsyncGetServByName;
1560          external winsocket name 'WSAAsyncGetServByName';
1561 function WSACancelAsyncRequest;
1562          external winsocket name 'WSACancelAsyncRequest';
1563 function WSASetBlockingHook;
1564          external    winsocket name 'WSASetBlockingHook';
1565 function WSAUnhookBlockingHook;
1566          external winsocket name 'WSAUnhookBlockingHook';
1567 function WSAGetLastError;
1568          external    winsocket name 'WSAGetLastError';
1569 procedure WSASetLastError;
1570          external    winsocket name 'WSASetLastError';
1571 function WSACancelBlockingCall;
1572          external winsocket name 'WSACancelBlockingCall';
1573 function WSAIsBlocking;
1574          external     winsocket name 'WSAIsBlocking';
1575 function WSAStartup;
1576          external     winsocket name 'WSAStartup';
1577 function WSACleanup;
1578          external     winsocket name 'WSACleanup';
1579 
1580 {$IFDEF UNICODE}
1581 function WSASetService;
1582          external     winsocket name 'WSASetServiceW';
1583 function WSAGetServiceClassNameByClassId;
1584          external     winsocket name 'WSAGetServiceClassNameByClassIdW';
1585 function WSAEnumNameSpaceProviders;
1586          external     winsocket name 'WSAEnumNameSpaceProvidersW';
1587 function WSAGetServiceClassInfo;
1588          external     winsocket name 'WSAGetServiceClassInfoW';
1589 function WSAInstallServiceClass;
1590          external     winsocket name 'WSAInstallServiceClassW';
1591 function WSALookupServiceNext;
1592          external     winsocket name 'WSALookupServiceNextW';
1593 function WSALookupServiceBegin;
1594          external     winsocket name 'WSALookupServiceBeginW';
1595 function WSAStringToAddress;
1596          external     winsocket name 'WSAStringToAddressW';
1597 function WSAAddressToString;
1598          external     winsocket name 'WSAAddressToStringW';
1599 function WSASocket;
1600          external     winsocket name 'WSASocketW';
1601 function WSAEnumProtocols;
1602          external     winsocket name 'WSAEnumProtocolsW';
1603 function WSADuplicateSocket;
1604          external     winsocket name 'WSADuplicateSocketW';
1605 {$ELSE}
1606 function WSASetService;
1607          external     winsocket name 'WSASetServiceA';
1608 function WSAGetServiceClassNameByClassId;
1609          external     winsocket name 'WSAGetServiceClassNameByClassIdA';
1610 function WSAEnumNameSpaceProviders;
1611          external     winsocket name 'WSAEnumNameSpaceProvidersA';
1612 function WSAGetServiceClassInfo;
1613          external     winsocket name 'WSAGetServiceClassInfoA';
1614 function WSAInstallServiceClass;
1615          external     winsocket name 'WSAInstallServiceClassA';
1616 function WSALookupServiceNext;
1617          external     winsocket name 'WSALookupServiceNextA';
1618 function WSALookupServiceBegin;
1619          external     winsocket name 'WSALookupServiceBeginA';
1620 function WSAStringToAddress;
1621          external     winsocket name 'WSAStringToAddressA';
1622 function WSAAddressToString;
1623          external     winsocket name 'WSAAddressToStringA';
1624 function WSASocket;
1625          external     winsocket name 'WSASocketA';
1626 function WSAEnumProtocols;
1627          external     winsocket name 'WSAEnumProtocolsA';
1628 function WSADuplicateSocket;
1629          external     winsocket name 'WSADuplicateSocketA';
1630 {$ENDIF} { UNICODE}
1631 
1632 
1633 function WSALookupServiceEnd;
1634          external     winsocket name 'WSALookupServiceEnd';
1635 function WSARemoveServiceClass;
1636          external     winsocket name 'WSARemoveServiceClass';
1637 function WSAWaitForMultipleEvents;
1638          external     winsocket name 'WSAWaitForMultipleEvents';
1639 function WSASetEvent;
1640          external     winsocket name 'WSASetEvent';
1641 function WSASendTo;
1642          external     winsocket name 'WSASendTo';
1643 function WSASendDisconnect;
1644          external     winsocket name 'WSASendDisconnect';
1645 function WSASend;
1646          external     winsocket name 'WSASend';
1647 function WSAResetEvent;
1648          external     winsocket name 'WSAResetEvent';
1649 function WSARecvFrom;
1650          external     winsocket name 'WSARecvFrom';
1651 function WSARecvDisconnect;
1652          external     winsocket name 'WSARecvDisconnect';
1653 function WSARecv;
1654          external     winsocket name 'WSARecv';
1655 function WSAIoctl;
1656          external     winsocket name 'WSAIoctl';
1657 function WSAJoinLeaf;
1658          external     winsocket name 'WSAJoinLeaf';
1659 function WSANtohl;
1660          external     winsocket name 'WSANtohl';
1661 function WSANtohs;
1662          external     winsocket name 'WSANtohs';
1663 function WSAHtons;
1664          external     winsocket name 'WSAHtons';
1665 function WSAHtonl;
1666          external     winsocket name 'WSAHtonl';
1667 function WSAGetQOSByName;
1668          external     winsocket name 'WSAGetQOSByName';
1669 function WSAGetOverlappedResult;
1670          external     winsocket name 'WSAGetOverlappedResult';
1671 function WSAEventSelect;
1672          external     winsocket name 'WSAEventSelect';
1673 function WSAEnumNetworkEvents;
1674          external     winsocket name 'WSAEnumNetworkEvents';
1675 function WSACreateEvent;
1676          external     winsocket name 'WSACreateEvent';
1677 function WSAConnect;
1678          external     winsocket name 'WSAConnect';
1679 function WSACloseEvent;
1680          external     winsocket name 'WSACloseEvent';
1681 function WSAAccept;
1682          external     winsocket name 'WSAAccept';
1683 
1684 function TransmitFile;
1685          external     winsocket name 'TransmitFile';
1686 
1687 end.
winsock2.pas

 参考资料:

      【完成端口详解】http://blog.csdn.net/piggyxp/article/details/6922277

      【TCP的那些事】http://coolshell.cn/articles/11564.html

 

posted @ 2015-01-01 23:34  伯通心智  阅读(2852)  评论(0)    收藏  举报