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这个方法来处理消息,具体可以看后面的附加代码。

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

附加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: [email protected]              }

  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 clashes 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

 

你可能感兴趣的:(connect)