如何反过来将 sockaddr in

本帖子已过去太久远了,不再提供回复功能。博客访问: 3860
博文数量: 2
注册时间:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 微软技术
&&这篇文章记录了我刚接触IOCP模型时的理解,对于初学者,应该算不错的调试程序,仅有一个400多行代码的dpr文件,可以直接用WriteLn输出信息,前提是会用建立Console&,当然你也可以很容易的就改成了C控制台程序或是其它语言。附加代码中有详细的注释,如果你已有IOCP经验,那么请不用在此浪费时间,这个示例不适合你。示例仅展示了IOCP中, DisconnectEx, GetSockaddr等的用法。在文章最后有推荐的两个连接,对于想深入研究IOCP与TCP的可以去看看,可人感觉值得去看。文中错误或是不合理的地方敬请原谅,如果方便还请指出,深表感谢!
&&&&刚接触IOCP时,因为要弄清里面的复杂关系,最直接的方法当然就是断点调试与信息输出了,所以我选用了控制台程序。具体的原理在文章末尾的第一个连接中讲得很详细,扩展的方法可以到MSDN上查。示例中仅用了一个工作线程和10个连接,个人觉得这样方便调试与查看输出信息,省去了多线程与数据池的干扰,当然在实际应用中会涉及线程池、消息队列、等等,不在这个示例展示范围。下面我只记录了我碰到的问题:
&&&&问题一:成功,但有客户端连接时,GetQueuedCompletionStatus却不返回,后来把ListenSocket用CreateIoCompletionPort绑定到完在端口之后问题不再出现,因为之前用WSAAccept,就没有把ListenSocket绑定。
&&&&问题二:10014错误,在一开始时,gOverls用了array[0..ACCEPT_COUNT - 1] of TIOCPRecord,用这样的类型时,是成功的,也能接收几个连接,但是测试的连接不完全能连上,后来改用array[0..ACCEPT_COUNT - 1] of PIOCPRecord,用New分配内存时,测试连接能全部连上,分析原因,可能是栈内存与堆内存的区别。另外一次出现10014是把TWSABUF中的u_long类型改为int64类型后出现这个错。
&&&&问题三:首次GetQueuedCompletionStatus的完键不是预期的那个,即soAccept时的那个完成键并不是想要的那个,连接后正常。我一开始时就已经把每一个待接收的Socket绑定到了完成端口,因为连接非法时不想在DisconnectEx那里判断。
&&&&问题四:要说一下T与TGetSockaddrs中的dwReceiveDataLength参数,这个初始值如果不是0,那么当IOCP接到一个连接时并不立即返回,而是收到客户端的数据时才返回。这会导致DOS攻击的大量连接耗尽预设等待的Socket连接,即投递的连接资源,如果设置为0,那么有连接时GetQueuedCompletionStatus就回立即返回,至于是否非法那就仁者见人智者见智了,比如心跳包的检测。使用时,一定要保证IOCP中有空闲的Socket接收客户端。
&&&&问题五:ERROR_IO_PENDING(997),当WSAGetLastError返回这个值时表示已经进入处理中,但并没有处理完。
&&& 问题六:GetQueuedCompletionStatus返回soWrite状态时,buffer的数据不一写就发送完了,没有发送完的数据继续WSASend。
&&&&下图是我写完这个示例后对IOCP中那几个API关系的理解,注意图中的箭头方向,PostQueuedCompletionStatus,,WSARecv, WSASend, DisconnectEx都是向IOCP内部投递数据,投递完后立即返回,这并不意味着投递的数据就会立即被处理,可以理解为进入一个等待处理队列,这几个方法可以投递多个数据不阻塞。PostQueuedCompletionStatus一般用于结束工作线程时使用,也就是GetQueuedCompletionStatus会得到PostQueuedCompletionStatus的状态信息。所有IOCP内部处理完的数据都会通过GetQueuedCompletionStatus这个方法反回,比如收到客户端请求后,发送数据到客户端后。这是一个阻塞的方法,当然可以设置超时。每一个工作线程也就通过GetQueuedCompletionStatus这个方法来处理消息,具体可以看后面的附加代码。
附加IOCPsever.dpr与WinSock2.pas:
1 program IOCPS
3 {$APPTYPE CONSOLE}
7 WinSock2 in 'winsock2.pas';
10 WINSOCK_VERSION = $0202;
11 LISTEN_PORT = 6553; //监听端口
12 MAX_BUFFSIZE = 4096; //数据buffer
13 ACCEPT_COUNT = 10; //接收连接数
14 SHUTDOWN_FLAG = $FFFFFFFF; //退出标记
16 SO_UPDATE_ACCEPT_CONTEXT = $700B;
17 TF_REUSE_SOCKET
19 IOC_VENDOR
20 IOC_OUT
21 SIO_KEEPALIVE_VALS
=IOC_IN or IOC_VENDOR or 4;
23 WSAID_GETSOCKADDRS: System.TGuid = (D1:$b:$D3:$11D4:($95,$ca,$00,$80,$5f,$48,$a1,$92));
24 WSAID_: System.TGuid = (D1:$b:$D3:$11D4:($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));
29 T = function(sListenSocket, sAcceptSocket: TS
lpOutputBuffer: P dwReceiveDataLength, dwLocalAddressLength,
31 dwRemoteAddressLength: LongW var lpdwBytesReceived: LongW
32 lpOverlapped: POverlapped): BOOL; stdcall;
34 TGetSockaddrs = procedure(lpOutputBuffer: P
dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
36 var LocalSockaddr: PSockA var LocalSockaddrLength: I
37 var RemoteSockaddr: PSockA var RemoteSockaddrLength: Integer);stdcall;
39 TConnectEx = function(const s : TS const name: PSOCKADDR; const
40 namelen: I lpSendBuffer : P dwSendDataLength : DWORD; var
41 lpdwBytesSent : LongW lpOverlapped : POverlapped): BOOL; stdcall;
43 TDisconnectEx = function(const hSocket : TS lpOverlapped: PO
44 const dwFlags : LongW const dwReserved : LongWord) : BOOL; stdcall;
46 PTCPKeepAlive = ^TTCPKeepA
47 TTCPKeepAlive = packed record
KeepInterval:
53 TSockOperate = (soAccept, soDisconnect, soRead, soWrite);
54 PIOCPRecord = ^TIOCPR
55 TIOCPRecord = packed
Ovelpd: TO
WsaBuf: TWsaB
58 Buffer: array [0..MAX_BUFFSIZE - 1] of AnsiC
operate: TSockO
gListen: TS
65 gOverls: array[0..ACCEPT_COUNT - 1] of PIOCPR
66 gIOCP: THandle = 0;
gWorker: TH
68 gFun: T = nil;
69 gFunGet: TGetSockaddrs = nil;
70 gFunConnectEx: TConnectEx = nil;
71 gFunDisconnectEx: TDisconnectEx = nil;
73 //加载扩展函数
74 function LoadFunEx(ASock: TSocket): B
tag: LongW
78 Result := F
79 if ASock = INVALID_SOCKET then E
81 tag := 0;
82 if SOCKET_ERROR = WSAIoctl(ASock, SIO_GET_EXTENSION_FUNCTION_POINTER,
@WSAID_, SizeOf(WSAID_),
84 @@gFun, SizeOf(Pointer), @tag, nil, nil)then
86 gFun := nil;
90 tag := 0;
91 if SOCKET_ERROR = WSAIoctl(ASock, SIO_GET_EXTENSION_FUNCTION_POINTER,
@WSAID_GETSOCKADDRS, SizeOf(WSAID_GETSOCKADDRS),
93 @@gFunGet, SizeOf(Pointer), @tag, nil, nil)then
95 gFunGet := nil;
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
E 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
E 113 end; 114 Result := T 115 except 116 end; 117 end; 118 119 //判断socket是否有效 120 function IsSocketAlive(ASock: TSocket): B 121 var 122
tmp: LongW 123 begin 124 Result := WinSock2.send(ASock, tmp, 0, 0)
-1; 125 end; 126 127 //设置心跳 128 procedure SetKeepLive(ASock: TSocket); 129 var 130
opt: I 131
dwFlags: DWORD; 132
inKeepAlive, OutKeepAlive: TTCPKeepA 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: TL 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: TS 164 begin 165 if Assigned(PData) then 166 begin 167 sock := PData. 168 FillChar(PData^, SizeOf(TIOCPRecord), 0); 169 PData^.WsaBuf.len := MAX_BUFFSIZE; 170 PData^.WsaBuf.buf := @(PData^.Buffer[0]); 171 PData.sock := 172 end; 173 end; 174 175 //投递一个接收socket 176 function PostAccept(PAccept: PIOCPRecord): B 177 var 178
dwBytes: LongW 179 begin 180 Result := F 181 if Assigned(PAccept) and (PAccept^.sock
INVALID_SOCKET) then 182 begin 183
ResetData(PAccept); 184 PAccept^.operate := soA 185 dwBytes := 0; 186 Result := gFun(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): B 195 begin 196 Result := F 197 if Assigned(PData) and (PData^.sock
INVALID_SOCKET) then 198 begin 199
ResetData(PData); 200 PData^.operate := soD 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): B 213 var 214
dwBuff, dwRecv: LongW 215 begin 216 Result := F 217 if Assigned(PData) and (PData^.sock
INVALID_SOCKET) then 218 begin 219
ResetData(PData); 220 PData^.operate := soR 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): Istdcall; 235 var 236
data: PIOCPR 237
workCount, dwSend, dwFlags: C 238
sock: TS 239
str: AnsiS 240
remoteAddr, localAddr: PSockA 241
remoteLen, localLen, opt: I 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(); 253
C 254 end; 255 WriteLn('Worker GetQueued socket:' + inttostr(sock)); 256 if Cardinal(data) = SHUTDOWN_FLAG then B // 有退出 257 if not Assigned(data) then continue; 258 259 case ^.operate of 260
soAccept: 261 begin 262 gFunGet(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('投递 socket: ' + Inttostr(^.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 - workC 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, @^.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() 304 end; 305 end; 306
soRead: 307 begin 308 if workCount = 0 then 309
PostDisconnect(data) 310 else begin 311 sock := data^. 312
SetLength(str, workCount); 313 Move(data^.Buffer[0], str[1], workCount); 314 WriteLn('接收数据 socket: ' + Inttostr(sock) + ' str: ' + str); 315 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 := soW 323 data^.sock := 324 Move(str[1], data^.Buffer[0], data^.WsaBuf.len); 325 if not ( (WSASend(sock, @(data^.WsaBuf), 1, @dwSend, dwFlags, @(^.Ovelpd), nil)
SOCKET_ERROR) 326 or (WSAGetlastError =
ERROR_IO_PENDING) ) then 327 begin 328 WriteLn('服务器回复数据失败 socket: ' + Inttostr(sock)); 329
PostRecv(); 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: C 341
need: B 343
WSData: TWSAD 344
addr: TSockA 345 console: array[0..255] of AnsiC 346 label exitL 347 begin 348 349 try 350 need := T 351 352 WriteLn('初始化网络环境'); 353 if WSAStartup(WINSOCK_VERSION, WSData)
0 then goto exitL 354 355 WriteLn('创建完成端口'); 356 gIOCP := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0); 357 if gIOCP = 0 then goto exitL 358 359 WriteLn('创建监听Socket'); 360 gListen := WSASocket(PF_INET, SOCK_STREAM, 0, nil, 0, WSA_FLAG_OVERLAPPED); 361 if gListen = INVALID_SOCKET then goto exitL 362 363 WriteLn('加载扩展函数'); 364 if not LoadFunEx(gListen) then goto exitL 365 366 WriteLn('邦定监听Socket 与IOCP [' + inttostr(gListen) + '][' + inttostr(gIOCP) + ']'); 367 if CreateIoCompletionPort(gListen, gIOCP, gListen, 0) = 0 then goto exitL 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 exitL 376 377 WriteLn('开始监听Socket'); 378 if WinSock2.listen(gListen, SOMAXCONN)
0 then goto exitL 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 exitL 387 if CreateIoCompletionPort(gOverls[i]^.sock, gIOCP, gOverls[i]^.sock, 0) = 0 then goto exitL 388 if PostAccept(gOverls[i]) then 389 WriteLn('投递Socket:' + Inttostr(gOverls[i]^.sock)) 390 else goto exitL 391 end; 392 393 //处理完端口请求 394 WriteLn('创建工作线程 '); 395 gWorker := BeginThread(nil, 0, @WorkProc, nil, 0, threadID); 396 if gWorker = 0 then goto exitL 397 398 WriteLn('键入exit退出 '); 399 while True do 400 begin 401
ReadLn(console); 402 if console = 'exit' then 403
B 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
WSAC 430 431 need := 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 {*******************************************************}
3 { Windows Sockets API v. 2.20 Header File }
5 { Prerelease 16.09.96 }
WinSock2.h from Winsock SDK 1.6 BETA }
8 { Delphi 2 RTL Windows32 API Interface }
10 { (c) 1996 by Artur Grajek 'AHS' }
11 { email: c51725ag@juggernaut.eti.pg.gda.pl }
13 {*******************************************************}
14 {$MINENUMSIZE 4} { Force 4 bytes enumeration size}
16 unit WinSock2;
18 interface
23 u_char = C
24 u_short = W
25 u_int = I
26 u_long = L
27 pu_long = ^u_
28 pu_short = ^u_
30 { The new type to be used in all
instances which refer to sockets. }
32 TSocket = u_
35 FD_SETSIZE
38 PFDSet = ^TFDS
39 TFDSet = packed record
fd_count: u_
41 fd_array: array[0..FD_SETSIZE-1] of TS
44 PTimeVal = ^TTimeV
45 TTimeVal = packed
tv_usec: L
51 IOCPARM_MASK = $7f;
52 IOC_VOID
53 IOC_OUT
55 IOC_INOUT
= (IOC_IN or IOC_OUT);
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;
70 { Protocols }
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 }
82 IPPROTO_RAW
83 IPPROTO_MAX
85 { Port/socket numbers: network standard functions}
87 IPPORT_ECHO
88 IPPORT_DISCARD = 9;
89 IPPORT_SYSTAT
90 IPPORT_DAYTIME = 13;
91 IPPORT_NETSTAT = 15;
92 IPPORT_FTP
93 IPPORT_TELNET
94 IPPORT_SMTP
95 IPPORT_TIMESERVER
96 IPPORT_NAMESERVER
97 IPPORT_WHOIS
98 IPPORT_MTP
100 { Port/socket numbers: host specific functions }
102 IPPORT_TFTP
103 IPPORT_RJE
104 IPPORT_FINGER
105 IPPORT_TTYLINK
106 IPPORT_SUPDUP
108 { UNIX TCP sockets }
110 IPPORT_EXECSERVER
111 IPPORT_LOGINSERVER = 513;
112 IPPORT_CMDSERVER
113 IPPORT_EFSSERVER
115 { UNIX UDP sockets }
117 IPPORT_BIFFUDP
118 IPPORT_WHOSERVER
119 IPPORT_ROUTESERVER = 520;
121 { Ports < IPPORT_RESERVED are reserved for
privileged processes (e.g. root). }
124 IPPORT_RESERVED
126 { Link numbers }
128 IMPLINK_IP
129 IMPLINK_LOWEXPER
130 IMPLINK_HIGHEXPER
133 SunB = packed record
s_b1, s_b2, s_b3, s_b4: u_
137 SunW = packed
s_w1, s_w2: u_
141 PInAddr = ^TInA
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);
149 PSockAddrIn = ^TSockAddrIn;
150 TSockAddrIn = packed record
151 case Integer of
152 0: (sin_family: u_
sin_port: u_
sin_addr: TInA
155 sin_zero: array[0..7] of Char);
156 1: (sa_family: u_
157 sa_: array[0..13] of Char)
160 PHostEnt = ^THostE
161 THostEnt = packed
h_name: PC
h_aliases: ^PC
h_addrtype: S
h_length: S
166 case integer of
167 0: (h_addr_list: ^PChar);
168 1: (h_addr: ^PInAddr);
171 PNetEnt = ^TNetE
172 TNetEnt = packed record
n_name: PC
n_aliases: ^PC
n_addrtype: S
179 PServEnt = ^TServE
180 TServEnt = packed record
s_name: PC
s_aliases: ^PC
s_proto: PC
187 PProtoEnt = ^TProtoE
188 TProtoEnt = packed
p_name: PC
p_aliases: ^P
p_proto: S
195 INADDR_ANY
196 INADDR_LOOPBACK
= $7F000001;
197 INADDR_BROADCAST = $FFFFFFFF;
198 INADDR_NONE
= $FFFFFFFF;
200 ADDR_ANY
= INADDR_ANY;
203 WSADESCRIPTION_LEN
204 WSASYS_STATUS_LEN
207 PWSAData = ^TWSAD
208 TWSAData = packed record
wVersion: W
wHighVersion: W
211 szDescription: array[0..WSADESCRIPTION_LEN] of C
212 szSystemStatus: array[0..WSASYS_STATUS_LEN] of C
iMaxSockets: W
iMaxUdpDg: W
lpVendorInfo: PC
218 PTransmitFileBuffers = ^TTransmitFileB
219 TTransmitFileBuffers = packed
HeadLength: DWORD;
TailLength: DWORD;
228 { Options for use with [gs]etsockopt at the IP level. }
230 IP_OPTIONS
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 }
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; { must fit in one mbuf }
241 { This is used instead of -1, since the
TSocket type is unsigned.}
244 INVALID_SOCKET
= TSocket(NOT(0));
245 SOCKET_ERROR
be used in place of the address family, socket type, or
to WSASocket to indicate that the corresponding value
be taken from the supplied WSAPROTOCOL_INFO structure instead of the
parameter itself.
253 FROM_PROTOCOL_INFO
255 { Types }
257 SOCK_STREAM
= 1; { stream socket }
258 SOCK_DGRAM
= 2; { gram socket }
259 SOCK_RAW
= 3; { raw-protocol interface }
260 SOCK_RDM
= 4; { reliably-delivered message }
261 SOCK_SEQPACKET
= 5; { sequenced packet stream }
263 { Option s per-socket. }
265 SO_DEBUG
= $0001; { turn on debugging info ing }
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 }
275 SO_DONTLINGER
277 { Additional options. }
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 }
288 { Options for connect and disconnect
and options.
Used only by
non-TCP/IP transports such as DECNet, OSI TP4, etc. }
291 SO_CONNDATA
292 SO_CONNOPT
293 SO_DISCDATA
294 SO_DISCOPT
295 SO_CONNDATALEN
296 SO_CONNOPTLEN
297 SO_DISCDATALEN
298 SO_DISCOPTLEN
300 { WinSock 2 extension -- new options }
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 }
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 }
315 { Option for opening sockets for synchronous access. }
317 SO_OPENTYPE
319 SO_SYNCHRONOUS_ALERT
320 SO_SYNCHRONOUS_NONALERT = $20;
322 { Other NT-specific options. }
324 SO_MAXDG
325 SO_MAXPATHDG
327 { TCP options. }
329 TCP_NODELAY
330 TCP_BSDURGENT
332 { Address families. }
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 }
= 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
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 }
361 AF_MAX
364 { Structure used by kernel to store most addresses. }
366 PSockAddr = ^TSockA
367 TSockAddr = TSockAddrIn;
369 { Structure used by kernel to pass protocol information in raw sockets. }
370 PSockProto = ^TSockP
371 TSockProto = packed
sp_family: u_
sp_protocol: u_
377 { Protocol families, same as address families for now. }
379 PF_UNSPEC
= AF_UNSPEC;
380 PF_UNIX
= AF_UNIX;
381 PF_INET
= AF_INET;
382 PF_IMPLINK
= AF_IMPLINK;
383 PF_PUP
384 PF_CHAOS
= AF_CHAOS;
386 PF_IPX
387 PF_ISO
388 PF_OSI
389 PF_ECMA
= AF_ECMA;
390 PF_DATAKIT
= AF_DATAKIT;
391 PF_CCITT
= AF_CCITT;
392 PF_SNA
393 PF_DECnet
394 PF_DLI
395 PF_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
402 PF_ATM
403 PF_INET6
= AF_INET6;
405 PF_MAX
408 { Structure used for manipulating linger option. }
409 PLinger = ^TL
410 TLinger = packed
l_onoff: u_
l_linger: u_
416 { Level number for (get/set)sockopt() to apply to socket itself. }
418 SOL_SOCKET
= $ {options for socket level }
420 { Maximum queue length specifiable by listen. }
422 SOMAXCONN
= $7 { AHS - by硂 5 !?????? }
424 MSG_OOB
= $1; {process out-of-band
425 MSG_PEEK
= $2; {peek at incoming message }
426 MSG_DONTROUTE
= $4; {send without using routing tables }
428 MSG_MAXIOVLEN
430 MSG_PARTIAL
= $8000; {partial send or recv for message xport }
432 { WinSock 2 extension -- new flags for WSASend(), WSASendTo(), WSARecv() and
WSARecvFrom() }
435 MSG_INTERRUPT
= $10; {send/recv in the interrupt context}
437 { Define constant based on rfc883, used by gethostbyxxxx() calls. }
439 MAXGETHOSTSTRUCT
441 { Define s to be used with the WSAAsyncSelect() call. }
443 FD_READ
444 FD_WRITE
445 FD_OOB
446 FD_ACCEPT
447 FD_CONNECT
448 FD_CLOSE
449 FD_QOS
450 FD_GROUP_QOS
451 FD_MAX_EVENTS
452 FD_ALL_EVENTS
= $100; { AHS - trudno powiedzie? ile powinno by?}
454 { All Windows Sockets error constants are biased by WSABASEERR from the "normal" }
456 WSABASEERR
458 { Windows Sockets definitions of regular Microsoft C error constants }
460 WSAEINTR
= (WSABASEERR+4);
461 WSAEBADF
= (WSABASEERR+9);
462 WSAEACCES
= (WSABASEERR+13);
463 WSAEFAULT
= (WSABASEERR+14);
464 WSAEINVAL
= (WSABASEERR+22);
465 WSAEMFILE
= (WSABASEERR+24);
467 { Windows Sockets definitions of regular Berkeley error constants }
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);
507 { Extended Windows Sockets error constant definitions }
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);
525 { Error return codes from gethostbyname() and gethostbyaddr()
(when using the resolver). Note that these errors are
retrieved via WSAGetLastError() and must therefore follow
the rules for avoiding clashes with error numbers from
specific implementations or language run-time systems.
For this reason the codes are based at WSABASEERR+1001.
Note also that [WSA]NO_ADDRESS is defined only for
compatibility purposes. }
534 { Authoritative Answer: Host not found }
536 WSAHOST_NOT_FOUND
= (WSABASEERR+1001);
537 HOST_NOT_FOUND
= WSAHOST_NOT_FOUND;
539 { Non-Authoritative: Host not found, or SERVERFAIL }
541 WSATRY_AGAIN
= (WSABASEERR+1002);
542 TRY_AGAIN
= WSATRY_AGAIN;
544 { Non recoverable errors, FORMERR, REFUSED, NOTIMP }
546 WSANO_RECOVERY
= (WSABASEERR+1003);
547 NO_RECOVERY
= WSANO_RECOVERY;
549 { Valid name, no
record of requested type }
551 WSANO_DATA
= (WSABASEERR+1004);
552 NO_DATA
= WSANO_DATA;
554 { no address, look for MX
556 WSANO_ADDRESS
= WSANO_DATA;
557 NO_ADDRESS
= WSANO_ADDRESS;
559 { Windows Sockets errors redefined as regular Berkeley error constants.
These are commented out in Windows NT to avoid conflicts with errno.h.
Use the WSA constants instead. }
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;
= 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;
601 { AHS }
602 { WinSock 2 extension -- new error codes and type definition }
605 WSAEVENT
= THANDLE;
606 LPHANDLE
= PHANDLE;
607 LPWSAEVENT
= LPHANDLE;
608 WSAOVERLAPPED
= TOVERLAPPED;
609 LPWSAOVERLAPPED
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;
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;
629 { WinSock 2 extension -- WSABUF and QOS struct }
633 PWSABUF = ^TWSABUF;
634 TWSABUF = packed record
: u_ { the length of the buffer }
{ the pointer to the buffer }
639 GUARANTEE = (
BestEffortService,
ControlledLoadService,
PredictiveService,
GuaranteedDelayService,
GuaranteedService
647 PFlowspec = ^TF
648 TFlowspec = packed
649 TokenRate
: LongI { In Bytes/sec }
650 TokenBucketSize
: LongI { In Bytes }
IT经典笑语录:系统程序员:1、头皮经常发麻,在看见一个蓝色屏幕的时候比较明显,在屏幕上什幺都看不见的时候尤其明显;2、乘电梯的时候总担心死机,并且在墙上找reset键; 3、指甲特别长,因为按F7到F12比较省力;
4、只要手里有东西,就不停地按,以为是Alt-F、S;5、机箱从来不上盖子,以便判断硬盘是否在转; 6、经常莫名其妙地跟踪别人,手里不停按F10;7、所有的接口都插上了硬盘,因此觉得26个字母不够;
8、一有空就念叨“下辈子不做程序员了”; 9、总是觉得9号以后是a号; 10、不怕病毒,但是很害怕自己的程序;
651 PeakBandwidth
: LongI { In Bytes/sec }
652 Latency
: LongI { In microseconds }
653 DelayVariation
: LongI { In microseconds }
654 LevelOfGuarantee
: G { Guaranteed, Predictive }
655 { or Best Effort }
656 CostOfCall
: LongI { Reserved for future use, }
657 { must be set to 0 now }
658 NetworkAvailability
: LongI { read-only: }
659 { 1 if accessible, }
660 { 0 if not }
663 PQOS = ^TQualityOfS
664 TQualityOfService = packed
665 SendingFlowspec
:TF { the flow spec for data sending }
666 ReceivingFlowspec
:TF { the flow spec for
receiving }
667 ProviderSpecific
:TWSAB { additional provider specific stuff }
672 { WinSock 2 extension -- manifest constants for return values of the
condition function}
675 CF_ACCEPT
676 CF_REJECT
677 CF_DEFER
679 {WinSock 2 extension -- manifest constants for shutdown() }
681 SD_RECEIVE
682 SD_SEND
683 SD_BOTH
685 { WinSock 2 extension -- data type and manifest constants for socket groups }
688 TGroup
689 PGroup
693 SG_UNCONSTRAINED_GROUP
694 SG_CONSTRAINED_GROUP
696 { WinSock 2 extension --
type for WSAEnumNetworkEvents() }
700 PWSANETWORKEVENTS = ^TWSANETWORKEVENTS;
701 TWSANETWORKEVENTS = packed record
lNetworkEvents
703 iErrorCode
: array [0..FD_MAX_EVENTS-1] of u_
706 {WinSock 2 extension -- WSAPROTOCOL_INFO structure and associated
manifest constants}
709 PGUID = ^TGUID;
710 TGUID = packed
: array [0..8-1] of u_
719 MAX_PROTOCOL_CHAIN
721 BASE_PROTOCOL
722 LAYERED_PROTOCOL
726 PWSAPROTOCOLCHAIN = ^TWSAPROTOCOLCHAIN;
727 TWSAPROTOCOLCHAIN = packed record
728 ChainLen
: I { 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 }
737 WSAPROTOCOL_LEN
741 PWSAPROTOCOL_INFOA = ^TWSAPROTOCOL_INFOA;
742 TWSAPROTOCOL_INFOA = packed
dwServiceFlags1
dwServiceFlags2
dwServiceFlags3
dwServiceFlags4
dwProviderFlags
ProviderId
dwCatalogEntryId
ProtocolChain
: TWSAPROTOCOLCHAIN;
iAddressFamily
iMaxSockAddr
iMinSockAddr
iSocketType
iProtocolMaxOffset
iNetworkByteOrder
iSecurityScheme
dwMessageSize
dwProviderReserved
762 szProtocol
: array [0..WSAPROTOCOL_LEN+1-1] of u_
765 PWSAPROTOCOL_INFOW = ^TWSAPROTOCOL_INFOW;
766 TWSAPROTOCOL_INFOW = packed
dwServiceFlags1
dwServiceFlags2
dwServiceFlags3
dwServiceFlags4
dwProviderFlags
ProviderId
dwCatalogEntryId
ProtocolChain
: TWSAPROTOCOLCHAIN;
iAddressFamily
iMaxSockAddr
iMinSockAddr
iSocketType
iProtocolMaxOffset
iNetworkByteOrder
iSecurityScheme
dwMessageSize
dwProviderReserved
786 szProtocol
: array [0..WSAPROTOCOL_LEN+1-1] of WCHAR;
789 {$ifdef UNICODE}
791 TWSAPROTOCOL_INFO
= TWSAPROTOCOL_INFOW ;
792 PWSAPROTOCOL_INFO = PWSAPROTOCOL_INFOW ;
794 {$else}
796 TWSAPROTOCOL_INFO
= TWSAPROTOCOL_INFOA ;
797 PWSAPROTOCOL_INFO = PWSAPROTOCOL_INFOA ;
799 {$endif UNICODE}
802 { Flag bit definitions for dwProviderFlags }
804 PFL_MULTIPLE_PROTO_ENTRIES
805 PFL_RECOMMENDED_PROTO_ENTRY
806 PFL_HIDDEN
807 PFL_MATCHES_PROTOCOL_ZERO
809 { Flag bit definitions for dwServiceFlags1 }
810 XP1_CONNECTIONLESS
811 XP1_GUARANTEED_DELIVERY
812 XP1_GUARANTEED_ORDER
813 XP1_MESSAGE_ORIENTED
814 XP1_PSEUDO_STREAM
815 XP1_GRACEFUL_CLOSE
816 XP1_EXPEDITED_DATA
817 XP1_CONNECT_DATA
818 XP1_DISCONNECT_DATA
819 XP1_SUPPORT_BROADCAST
820 XP1_SUPPORT_MULTIPOINT
821 XP1_MULTIPOINT_CONTROL_PLANE
822 XP1_MULTIPOINT_DATA_PLANE
823 XP1_QOS_SUPPORTED
824 XP1_INTERRUPT
825 XP1_UNI_SEND
826 XP1_UNI_RECV
827 XP1_IFS_HANDLES
828 XP1_PARTIAL_MESSAGE
830 BIGENDIAN
831 LITTLEENDIAN
833 SECURITY_PROTOCOL_NONE
835 { WinSock 2 extension -- manifest constants for WSAJoinLeaf() }
837 JL_SENDER_ONLY
838 JL_RECEIVER_ONLY
839 JL_BOTH
841 { WinSock 2 extension -- manifest constants for WSASocket() }
843 WSA_FLAG_OVERLAPPED
844 WSA_FLAG_MULTIPOINT_C_ROOT
845 WSA_FLAG_MULTIPOINT_C_LEAF
846 WSA_FLAG_MULTIPOINT_D_ROOT
847 WSA_FLAG_MULTIPOINT_D_LEAF
849 { WinSock 2 extension -- manifest constants for WSAIoctl() }
851 IOC_UNIX
852 IOC_WS2
853 IOC_PROTOCOL
854 IOC_VENDOR
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;
870 { WinSock 2 extension -- manifest constants for SIO_TRANSLATE_HANDLE ioctl }
872 TH_NETDEV
873 TH_TAPI
875 { Microsoft Windows Extended
types required for the functions to
addresses. }
881 SOCKADDR
= TSockA { AHS ?}
882 { PSOCKADDR
883 LPSOCKADDR
885 { Manifest constants and type definitions related to name resolution and
registration (RNR) API }
888 PBLOB = ^TBLOB;
889 TBLOB = packed
pBlobData :^
894 { Service Install Flags }
898 SERVICE_MULTIPLE
900 { Name Spaces }
902 NS_ALL
904 NS_SAP
905 NS_NDS
906 NS_PEER_BROWSE
908 NS_TCPIP_LOCAL
909 NS_TCPIP_HOSTS
910 NS_DNS
911 NS_NETBT
912 NS_WINS
914 NS_NBP
917 NS_STDA
918 NS_NTDS
920 NS_X500
921 NS_NIS
922 NS_NISPLUS
924 NS_WRQ
927 { Resolution s for WSAGetAddressByName().
Note these are also used by the 1.1 API GetAddressByName, so
leave them around. }
931 RES_UNUSED_1 =$;
932 RES_FLUSH_CACHE
933 RES_SERVICE
936 { Well known value names for Service Types }
938 SERVICE_TYPE_VALUE_IPXPORTA
='IpxSocket';
939 SERVICE_TYPE_VALUE_IPXPORTW
= 'IpxSocket';
940 SERVICE_TYPE_VALUE_SAPIDA
= 'SapId';
941 SERVICE_TYPE_VALUE_SAPIDW
943 SERVICE_TYPE_VALUE_TCPPORTA
= 'TcpPort';
944 SERVICE_TYPE_VALUE_TCPPORTW
='TcpPort';
946 SERVICE_TYPE_VALUE_UDPPORTA
= 'UdpPort';
947 SERVICE_TYPE_VALUE_UDPPORTW
='UdpPort';
949 SERVICE_TYPE_VALUE_OBJECTIDA
= 'ObjectId';
950 SERVICE_TYPE_VALUE_OBJECTIDW
='ObjectId';
952 {$ifdef UNICODE}
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;
959 {$else} { not UNICODE }
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;
966 {$endif}
968 { SockAddr Information }
971 PSOCKET_ADDRESS = ^TSOCKET_ADDRESS;
972 TSOCKET_ADDRESS = packed record
lpSockaddr
PSOCKADDR ;
iSockaddrLength
977 { CSAddr Information }
979 PCSADDR_INFO = ^TCSADDR_INFO;
980 TCSADDR_INFO = packed
:TSOCKET_ADDRESS;
RemoteAddr
:TSOCKET_ADDRESS;
iSocketType
988 { Address Family/Protocol Tuples }
990 PAFPROTOCOLS = ^TAFPROTOCOLS;
991 TAFPROTOCOLS = packed record
iAddressFamily
996 { Client Query API Typedefs }
998 { The comparators }
999 1000 PWSAEcomparator = ^TWSAE 1001 TWSAEcomparator = ( 1002
COMP_EQUAL, 1003
COMP_NOTLESS 1004 ); 1005 1006 PWSAVersion = ^TWSAV 1007 TWSAVersion = packed record 1008
: TWSAEC 1010 end; 1011 1012 PWSAQuerySetA = ^TWSAQuerySetA; 1013 TWSAQuerySetA = packed
lpszServiceInstanceName : PC 1016
lpServiceClassId
: PGUID; 1017
: PWSAVERSION; 1018
lpszComment
dwNameSpace
lpNSProviderId
: PGUID; 1021
lpszContext
dwNumberOfProtocols
: DWORD; 1023
lpafpProtocols
: PAFPROTOCOLS; 1024
lpszQueryString
dwNumberOfCsAddrs
lpcsaBuffer
: PCSADDR_INFO; 1027
dwOutputFlags
: PBLOB; 1029 end; 1030 1031 PWSAQuerySetW = ^TWSAQuerySetW; 1032 TWSAQuerySetW = packed
: DW 1034 lpszServiceInstanceName : PWideC //MIO, antes WideChar 1035
lpServiceClassId
: PGUID; 1036
: PWSAVERSION; 1037 lpszComment
: PWideC //MIO, antes WideChar 1038
dwNameSpace
lpNSProviderId
: PGUID; 1040 lpszContext
: PWideC //MIO, antes WideChar 1041
dwNumberOfProtocols
: DWORD; 1042
lpafpProtocols
: PAFPROTOCOLS; 1043 lpszQueryString
: PWideC //MIO, antes WideChar 1044
dwNumberOfCsAddrs
lpcsaBuffer
: PCSADDR_INFO; 1046
dwOutputFlags
: 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 s } 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
dwNameSpace
dwValueType
dwValueSize
: P 1107 end; 1108 1109 PWSANSClassInfoW = ^TWSANSClassInfoW; 1110 TWSANSClassInfoW = packed
: WideC 1112
dwNameSpace
dwValueType
dwValueSize
: P 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
lpClassInfos
: PWSANSCLASSINFOA; 1136 end; 1137 1138 PWSAServiceClassInfoW = ^TWSAServiceClassInfoW; 1139 TWSAServiceClassInfoW = packed
lpServiceClassId
: PGUID; 1141
lpszServiceClassName
: WideC 1142
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
: BOOL; 1163
lpszIdentifier
: PC 1165 end; 1166 1167 PWSANAMESPACE_INFOW = ^TWSANAMESPACE_INFOW; 1168 TWSANAMESPACE_INFOW = packed
NSProviderId
: TGUID; 1170
dwNameSpace
: BOOL; 1172
lpszIdentifier
: WideC 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: TS addr: PSockA var addrlen: Integer): TS stdcall; 1194 // Using "var addr:TSockAddr" in bind makes impossible to compile for IPv6 1195 function bind(s: TS addr: PSockA namelen: Integer): I stdcall; 1196 function closesocket(s: TSocket): I stdcall; 1197 // Using "var addr:TSockAddr" in connect makes impossible to compile for IPv6 1198 function connect(s: TS name: PSockA namelen: Integer): I stdcall; 1199 function ioctlsocket(s: TS cmd: L var arg: u_long): I stdcall; 1200 function getpeername(s: TS var name: TSockA var namelen: Integer): I stdcall; 1201 // Using "var addr:TSockAddr" in getsockname makes impossible to compile for IPv6 1202 function getsockname(s: TS name: PSockA var namelen: Integer): I stdcall; 1203 function getsockopt(s: TS level, optname: I optval: PC var optlen: Integer): I stdcall; 1204 function htonl(hostlong: u_long): u_ stdcall; 1205 function htons(hostshort: u_short): u_ stdcall; 1206 function inet_addr(cp: PChar): u_ stdcall; {PInA} { TInAddr } 1207 function inet_ntoa(inaddr: TInAddr): PC stdcall; 1208 function listen(s: TS backlog: Integer): I stdcall; 1209 function ntohl(netlong: u_long): u_ stdcall; 1210 function ntohs(netshort: u_short): u_ stdcall; 1211 function recv(s: TS var B len, flags: Integer): I stdcall; 1212 // Using "var from: TSockAddr" in recvfrom makes impossible to compile for IPv6 1213 function recvfrom(s: TS var B len, flags: I 1214 from: PSockA var fromlen: Integer): I stdcall; 1215 function select(nfds: I readfds, writefds, exceptfds: PFDS 1216 timeout: PTimeVal): L stdcall; 1217 function send(s: TS var B len, s: Integer): I stdcall; 1218 // Using "var addrto: TSockAddr" in sendto makes impossible to compile for IPv6 1219 function sendto(s: TS var B len, s: I addrto: PSockA 1220 tolen: Integer): I stdcall; 1221 function setsockopt(s: TS level, optname: I optval: PC 1222 optlen: Integer): I stdcall; 1223 function shutdown(s: TS how: Integer): I stdcall; 1224 function socket(af, struct, protocol: Integer): TS stdcall; 1225 function gethostbyaddr(addr: P len, struct: Integer): PHostE stdcall; 1226 function gethostbyname(name: PChar): PHostE stdcall; 1227 function gethostname(name: PC len: Integer): I stdcall; 1228 function getservbyport(port: I proto: PChar): PServE stdcall; 1229 function getservbyname(name, proto: PChar): PServE stdcall; 1230 function getprotobynumber(proto: Integer): PProtoE stdcall; 1231 function getprotobyname(name: PChar): PProtoE stdcall; 1232 function WSAStartup(wVersionRequired: var WSData: TWSAData): I stdcall; 1233 function WSACleanup: I stdcall; 1234 procedure WSASetLastError(iError: Integer); stdcall; 1235 function WSAGetLastError: I stdcall; 1236 function WSAIsBlocking: BOOL; stdcall; 1237 function WSAUnhookBlockingHook: I stdcall; 1238 function WSASetBlockingHook(lpBlockFunc: TFarProc): TFarP stdcall; 1239 function WSACancelBlockingCall: I stdcall; 1240 function WSAAsyncGetServByName(HWindow: HWND; wMsg: u_ 1241 name, proto, buf: PC buflen: Integer): TH stdcall; 1242 function WSAAsyncGetServByPort( HWindow: HWND; wMsg, port: u_ 1243 proto, buf: PC buflen: Integer): TH stdcall; 1244 function WSAAsyncGetProtoByName(HWindow: HWND; wMsg: u_ 1245 name, buf: PC buflen: Integer): TH stdcall; 1246 function WSAAsyncGetProtoByNumber(HWindow: HWND; wMsg: u_ number: I 1247 buf: PC buflen: Integer): TH stdcall; 1248 function WSAAsyncGetHostByName(HWindow: HWND; wMsg: u_ 1249 name, buf: PC buflen: Integer): TH stdcall; 1250 function WSAAsyncGetHostByAddr(HWindow: HWND; wMsg: u_ addr: PC 1251 len, struct: I buf: PC buflen: Integer): TH stdcall; 1252 function WSACancelAsyncRequest(hAsyncTaskHandle: THandle): I stdcall; 1253 function WSAAsyncSelect(s: TS HWindow: HWND; wMsg: u_ lEvent: Longint): I stdcall; 1254 1255 { WinSock 2 extensions --
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:PG dwCallbackData:DWord) :u_ stdcall; 1263 1264 PWSAOVERLAPPED_COMPLETION_ROUTINE = procedure ( dwError :D 1265
cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: Dword 1266 ); stdcall; 1267 1268 { WinSock 2 API new function prototypes } 1269 1270 function WSAAccept( s: TSOCKET; addr: addrlen: PINT; 1271 lpfnCondition: PCONDITIONPROC; dwCallbackData: DWORD): TSOCKET; stdcall; 1272 function WSACloseEvent( hEvent: WSAEVENT ):BOOL; stdcall; 1273 function WSAConnect(s: TSOCKET; name:namelen: u_ 1274
lpCallerData: PWSABUF; lpCalleeData: PWSABUF; lpSQOS: PQOS; 1275 lpGQOS: PQOS) : u_ stdcall; 1276 function WSACreateEvent:WSAEVENT; stdcall; 1277 1278 {$IFDEF UNICODE} 1279 function WSADuplicateSocket(s: TS dwProcessId: DWORD; 1280 lpProtocolInfo: PWSAPROTOCOL_INFOW): u_ stdcall; 1281 {$ELSE} 1282 function WSADuplicateSocket(s: TS dwProcessId: DWORD; 1283 lpProtocolInfo: PWSAPROTOCOL_INFOA): u_ stdcall; 1284 {$ENDIF} {UNICODE} 1285 1286 function WSAEnumNetworkEvents( s: TS hEventObject: WSAEVENT; 1287 lpNetworkEvents: PWSANETWORKEVENTS): u_ stdcall; 1288 1289 {$IFDEF UNICODE} 1290 function WSAEnumProtocols( lpiProtocols: PI 1291
lpProtocolBuffer: PWSAPROTOCOL_INFOW; lpdwBufferLength: PDWORD 1292 ): u_ stdcall; 1293 {$ELSE} 1294 function WSAEnumProtocols( lpiProtocols: PI 1295
lpProtocolBuffer: PWSAPROTOCOL_INFOA; lpdwBufferLength: PDWORD 1296 ): u_ stdcall; 1297 {$ENDIF} {UNICODE} 1298 1299 function WSAEventSelect(s: TSOCKET; hEventObject: WSAEVENT; 1300 lNetworkEvents: u_long): u_ stdcall; 1301 function WSAGetOverlappedResult( s: TS lpOverlapped: LPWSAOVERLAPPED; 1302 lpcbTransfer: PDWORD; fWait: BOOL; lpdwFlags: PDWORD): BOOL; stdcall; 1303 function WSAGetQOSByName( s: TS lpQOSName: PWSABUF; 1304 lpQOS: PQOS): BOOL; stdcall; 1305 function WSAHtonl( s: TS hostlong: u_ lpnetlong: pu_long) 1306 : u_ stdcall; 1307 function WSAHtons( s: TS hostshort: u_ lpnetshort: pu_short) 1308 : u_ stdcall; 1309 function WSAIoctl( s: TS dwIoControlCode: DWORD; lpvInBuffer: P 1310
cbInBuffer: DWORD; lpvOutBuffer: P cbOutBuffer: DWORD; 1311
lpcbBytesReturned: PDWORD; lpOverlapped: LPWSAOVERLAPPED; 1312 lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_ stdcall; 1313 function WSAJoinLeaf( s: TS name: namelen: u_ 1314
lpCallerData: PWSABUF; lpCalleeData: PWSABUF; lpSQOS: PQOS; lpGQOS: PQOS; 1315 dwFlags: DWORD): TS stdcall; 1316 function WSANtohl( s: TS netlong: u_ lphostlong: pu_long) 1317 : u_ stdcall; 1318 function WSANtohs( s: TS netshort: u_ lphostshort: pu_short) 1319 : u_ stdcall; 1320 function WSARecv( s: TS lpBuffers: PWSABUF; dwBufferCount: DWORD; 1321
lpNumberOfBytesRecvd: PDWORD; lpFlags: PDWORD;lpOverlapped: LPWSAOVERLAPPED; 1322 lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_ stdcall; 1323 function WSARecvDisconnect( s: TS lpInboundDisconnectData: PWSABUF) 1324 : u_ stdcall; 1325 function WSARecvFrom( s: TS lpBuffers: PWSABUF; dwBufferCount: DWORD; 1326
lpNumberOfBytesRecvd: PDWORD; lpFlags: PDWORD; lpFrom: 1327
lpFromlen: PI lpOverlapped: LPWSAOVERLAPPED; 1328 lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_ stdcall; 1329 function WSAResetEvent( hEvent: WSAEVENT): BOOL; stdcall; 1330 function WSASend( s: TS lpBuffers: PWSABUF; dwBufferCount: DWORD; 1331
lpNumberOfBytesSent: PDWORD; dwFlags: DWORD; lpOverlapped: LPWSAOVERLAPPED; 1332 lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_ stdcall; 1333 function WSASendDisconnect( s: TS lpOutboundDisconnectData: PWSABUF) 1334 : u_ stdcall; 1335 function WSASendTo(s: TS lpBuffers: PWSABUF; dwBufferCount: DWORD; 1336
lpNumberOfBytesSent: PDWORD;dwFlags: DWORD; lpTo: iTolen: u_ 1337
lpOverlapped: LPWSAOVERLAPPED; 1338 lpCompletionRoutine: PWSAOVERLAPPED_COMPLETION_ROUTINE): u_ stdcall; 1339 function WSASetEvent( hEvent: WSAEVENT): BOOL; stdcall; 1340 {$IFDEF UNICODE} 1341 function WSASocket( af: u_ atype: u_ protocol: u_ 1342
lpProtocolInfo: PWSAPROTOCOL_INFOW; g: TG dwFlags: Dword) 1343 : TS stdcall; 1344 {$ELSE} 1345 function WSASocket( af: u_ atype: u_ protocol: u_ 1346
lpProtocolInfo: PWSAPROTOCOL_INFOA; g: TG dwFlags: Dword) 1347 : TS 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: WideC 1354 lpdwAddressStringLength: PDWORD): u_ stdcall; 1355 {$ELSE} 1356 function WSAAddressToString( lpsaAddress: PSOCKADDR; dwAddressLength: DWORD; 1357
lpProtocolInfo: PWSAPROTOCOL_INFOA; lpszAddressString: PC 1358 lpdwAddressStringLength: PDWORD): u_ stdcall; 1359 {$ENDIF} { UNICODE} 1360 1361 {$IFDEF UNICODE} 1362 function WSAStringToAddress( AddressString: WideC AddressFamily: u_ 1363
lpProtocolInfo: PWSAPROTOCOL_INFOW; lpAddress: PSOCKADDR; 1364 lpAddressLength: PInt): u_ stdcall; 1365 {$ELSE} 1366 function WSAStringToAddress( AddressString: PC AddressFamily: u_ 1367
lpProtocolInfo: PWSAPROTOCOL_INFOA; lpAddress: PSOCKADDR; 1368 lpAddressLength: PInt): u_ 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_ stdcall; 1376 {$ELSE} 1377 function WSALookupServiceBegin( lpqsRestrictions: PWSAQUERYSETA; 1378 dwControlFlags: DWORD; lphLookup: LPHANDLE): u_ stdcall; 1379 {$ENDIF} { UNICODE} 1380 1381 {$IFDEF UNICODE} 1382 function WSALookupServiceNext( hLookup: THANDLE; dwControlFlags: DWORD; 1383 lpdwBufferLength: PDWORD; lpqsResults: PWSAQUERYSETW): u_ stdcall; 1384 {$ELSE} 1385 function WSALookupServiceNext( hLookup: THANDLE; dwControlFlags: DWORD; 1386 lpdwBufferLength: PDWORD; lpqsResults: PWSAQUERYSETA): LongI stdcall; 1387 {$ENDIF} { UNICODE} 1388 1389 function WSALookupServiceEnd( hLookup: THandle): u_ stdcall; 1390 1391 {$IFDEF UNICODE} 1392 function WSAInstallServiceClass( lpServiceClassInfo: PWSASERVICECLASSINFOW 1393 ): u_ stdcall; 1394 {$ELSE} 1395 function WSAInstallServiceClass( lpServiceClassInfo: PWSASERVICECLASSINFOA 1396 ): u_ stdcall; 1397 {$ENDIF} { UNICODE} 1398 1399 function WSARemoveServiceClass(lpServiceClassId: PGUID): u_ stdcall; 1400 1401 {$IFDEF UNICODE} 1402 function WSAGetServiceClassInfo( lpProviderId: PGUID; lpServiceClassId: PGUID; 1403
lpdwBufSize: PDWORD; lpServiceClassInfo: PWSASERVICECLASSINFOW) 1404 : u_ stdcall; 1405 {$ELSE} 1406 function WSAGetServiceClassInfo( lpProviderId: PGUID; lpServiceClassId: PGUID; 1407
lpdwBufSize: PDWORD; lpServiceClassInfo: PWSASERVICECLASSINFOA) 1408 : u_ stdcall; 1409 {$ENDIF} { UNICODE} 1410 1411 {$IFDEF UNICODE} 1412 function WSAEnumNameSpaceProviders( lpdwBufferLength: PDWORD; 1413 lpnspBuffer: PWSANAMESPACE_INFOW):u_ stdcall; 1414 {$ELSE} 1415 function WSAEnumNameSpaceProviders( lpdwBufferLength: PDWORD; 1416 lpnspBuffer: PWSANAMESPACE_INFOA):u_ stdcall; 1417 {$ENDIF} { UNICODE} 1418 1419 {$IFDEF UNICODE} 1420 function WSAGetServiceClassNameByClassId( lpServiceClassId: PGUID; 1421 lpszServiceClassName: WideC lpdwBufferLength: PDWORD): u_ stdcall; 1422 {$ELSE} 1423 function WSAGetServiceClassNameByClassId( lpServiceClassId: PGUID; 1424 lpszServiceClassName: PC lpdwBufferLength: PDWORD): u_ stdcall; 1425 {$ENDIF} { UNICODE} 1426 1427 {$IFDEF UNICODE} 1428 function WSASetService( lpqsRegInfo: PWSAQUERYSETW; 1429 essoperation: TWSAESETSERVICEOP; dwControlFlags: DWORD):u_ stdcall; 1430 {$ELSE} 1431 function WSASetService( lpqsRegInfo: PWSAQUERYSETA; 1432 essoperation: TWSAESETSERVICEOP; dwControlFlags: DWORD):u_ stdcall; 1433 {$ENDIF} { UNICODE} 1434 1435 function WSARecvEx(s: TS var len: I var s: Integer): I stdcall; 1436 1437 function TransmitFile(hSocket: TS hFile: TH nNumberOfBytesToWrite: DWORD; 1438
nNumberOfBytesPerSend: DWORD; lpOverlapped: PO 1439 lpTransmitBuffers: PTransmitFileB dwReserved: DWORD): BOOL; stdcall; 1440 1441 function WSAMakeASyncReply(Buflen, Error: Word): L 1442 function WSAMakeSelectReply(Event, Error: Word): L 1443 function WSAGetAsyncBuflen(Param: Longint): W 1444 function WSAGetAsyncError(Param: Longint): W 1445 function WSAGetSelectEvent(Param: Longint): W 1446 function WSAGetSelectError(Param: Longint): W 1447 1448 implementation 1449 1450 const 1451 winsocket = 'ws2_32.dll'; 1452 1453 function WSAMakeASyncR 1454 begin 1455 WSAMakeASyncReply:= MakeLong(Buflen, Error); 1456 end; 1457 1458 function WSAMakeSelectR 1459 begin 1460 WSAMakeSelectReply:= MakeLong(Event, Error); 1461 end; 1462 1463 function WSAGetAsyncB 1464 begin 1465 WSAGetAsyncBuflen:= LOWORD(Param); 1466 end; 1467 1468 function WSAGetAsyncE 1469 begin 1470 WSAGetAsyncError:= HIWORD(Param); 1471 end; 1472 1473 function WSAGetSelectE 1474 begin 1475 WSAGetSelectEvent:= LOWORD(Param); 1476 end; 1477 1478 function WSAGetSelectE 1479 begin 1480 WSAGetSelectError:= HIWORD(Param); 1481 end; 1482 1483 function 1484 external winsocket name 'accept'; 1485 function 1486 external winsocket name 'bind'; 1487 function 1488 external winsocket name 'closesocket'; 1489 function 1490 external winsocket name 'connect'; 1491 function 1492 external winsocket name 'getpeername'; 1493 function 1494 external winsocket name 'getsockname'; 1495 function 1496 external winsocket name 'getsockopt'; 1497 function 1498 external winsocket name 'htonl'; 1499 function 1500 external winsocket name 'htons'; 1501 function inet_ 1502 external winsocket name 'inet_addr'; 1503 function inet_ 1504 external winsocket name 'inet_ntoa'; 1505 function 1506 external winsocket name 'ioctlsocket'; 1507 function 1508 external winsocket name 'listen'; 1509 function 1510 external winsocket name 'ntohl'; 1511 function 1512 external winsocket name 'ntohs'; 1513 function 1514 external winsocket name 'recv'; 1515 function 1516 external winsocket name 'recvfrom'; 1517 function 1518 external winsocket name 'select'; 1519 function 1520 external winsocket name 'send'; 1521 function 1522 external winsocket name 'sendto'; 1523 function 1524 external winsocket name 'setsockopt'; 1525 function 1526 external winsocket name 'shutdown'; 1527 function 1528 external winsocket name 'socket'; 1529 1530 function 1531 external winsocket name 'gethostbyaddr'; 1532 function 1533 external winsocket name 'gethostbyname'; 1534 function 1535 external winsocket name 'getprotobyname'; 1536 function 1537 external winsocket name 'getprotobynumber'; 1538 function 1539 external winsocket name 'getservbyname'; 1540 function 1541 external winsocket name 'getservbyport'; 1542 function 1543 external winsocket name 'gethostname'; 1544 1545 function WSAAsyncS 1546 external winsocket name 'WSAAsyncSelect'; 1547 function WSARecvEx; 1548 external winsocket name 'WSARecvEx'; 1549 function WSAAsyncGetHostByA 1550 external winsocket name 'WSAAsyncGetHostByAddr'; 1551 function WSAAsyncGetHostByN 1552 external winsocket name 'WSAAsyncGetHostByName'; 1553 function WSAAsyncGetProtoByN 1554 external winsocket name 'WSAAsyncGetProtoByNumber'; 1555 function WSAAsyncGetprotoByN 1556 external winsocket name 'WSAAsyncGetprotoByName'; 1557 function WSAAsyncGetServByP 1558 external winsocket name 'WSAAsyncGetServByPort'; 1559 function WSAAsyncGetServByN 1560 external winsocket name 'WSAAsyncGetServByName'; 1561 function WSACancelAsyncR 1562 external winsocket name 'WSACancelAsyncRequest'; 1563 function WSASetBlockingH 1564 external winsocket name 'WSASetBlockingHook'; 1565 function WSAUnhookBlockingH 1566 external winsocket name 'WSAUnhookBlockingHook'; 1567 function WSAGetLastE 1568 external winsocket name 'WSAGetLastError'; 1569 procedure WSASetLastE 1570 external winsocket name 'WSASetLastError'; 1571 function WSACancelBlockingC 1572 external winsocket name 'WSACancelBlockingCall'; 1573 function WSAIsB 1574 external winsocket name 'WSAIsBlocking'; 1575 function WSAS 1576 external winsocket name 'WSAStartup'; 1577 function WSAC 1578 external winsocket name 'WSACleanup'; 1579 1580 {$IFDEF UNICODE} 1581 function WSASetS 1582 external winsocket name 'WSASetServiceW'; 1583 function WSAGetServiceClassNameByClassId; 1584 external winsocket name 'WSAGetServiceClassNameByClassIdW'; 1585 function WSAEnumNameSpaceP 1586 external winsocket name 'WSAEnumNameSpaceProvidersW'; 1587 function WSAGetServiceClassI 1588 external winsocket name 'WSAGetServiceClassInfoW'; 1589 function WSAInstallServiceC 1590 external winsocket name 'WSAInstallServiceClassW'; 1591 function WSALookupServiceN 1592 external winsocket name 'WSALookupServiceNextW'; 1593 function WSALookupServiceB 1594 external winsocket name 'WSALookupServiceBeginW'; 1595 function WSAStringToA 1596 external winsocket name 'WSAStringToAddressW'; 1597 function WSAAddressToS 1598 external winsocket name 'WSAAddressToStringW'; 1599 function WSAS 1600 external winsocket name 'WSASocketW'; 1601 function WSAEnumP 1602 external winsocket name 'WSAEnumProtocolsW'; 1603 function WSADuplicateS 1604 external winsocket name 'WSADuplicateSocketW'; 1605 {$ELSE} 1606 function WSASetS 1607 external winsocket name 'WSASetServiceA'; 1608 function WSAGetServiceClassNameByClassId; 1609 external winsocket name 'WSAGetServiceClassNameByClassIdA'; 1610 function WSAEnumNameSpaceP 1611 external winsocket name 'WSAEnumNameSpaceProvidersA'; 1612 function WSAGetServiceClassI 1613 external winsocket name 'WSAGetServiceClassInfoA'; 1614 function WSAInstallServiceC 1615 external winsocket name 'WSAInstallServiceClassA'; 1616 function WSALookupServiceN 1617 external winsocket name 'WSALookupServiceNextA'; 1618 function WSALookupServiceB 1619 external winsocket name 'WSALookupServiceBeginA'; 1620 function WSAStringToA 1621 external winsocket name 'WSAStringToAddressA'; 1622 function WSAAddressToS 1623 external winsocket name 'WSAAddressToStringA'; 1624 function WSAS 1625 external winsocket name 'WSASocketA'; 1626 function WSAEnumP 1627 external winsocket name 'WSAEnumProtocolsA'; 1628 function WSADuplicateS 1629 external winsocket name 'WSADuplicateSocketA'; 1630 {$ENDIF} { UNICODE} 1631 1632 1633 function WSALookupServiceE 1634 external winsocket name 'WSALookupServiceEnd'; 1635 function WSARemoveServiceC 1636 external winsocket name 'WSARemoveServiceClass'; 1637 function WSAWaitForMultipleE 1638 external winsocket name 'WSAWaitForMultipleEvents'; 1639 function WSASetE 1640 external winsocket name 'WSASetEvent'; 1641 function WSASendTo; 1642 external winsocket name 'WSASendTo'; 1643 function WSASendD 1644 external winsocket name 'WSASendDisconnect'; 1645 function WSAS 1646 external winsocket name 'WSASend'; 1647 function WSAResetE 1648 external winsocket name 'WSAResetEvent'; 1649 function WSARecvF 1650 external winsocket name 'WSARecvFrom'; 1651 function WSARecvD 1652 external winsocket name 'WSARecvDisconnect'; 1653 function WSAR 1654 external winsocket name 'WSARecv'; 1655 function WSAI 1656 external winsocket name 'WSAIoctl'; 1657 function WSAJoinL 1658 external winsocket name 'WSAJoinLeaf'; 1659 function WSAN 1660 external winsocket name 'WSANtohl'; 1661 function WSAN 1662 external winsocket name 'WSANtohs'; 1663 function WSAH 1664 external winsocket name 'WSAHtons'; 1665 function WSAH 1666 external winsocket name 'WSAHtonl'; 1667 function WSAGetQOSByN 1668 external winsocket name 'WSAGetQOSByName'; 1669 function WSAGetOverlappedR 1670 external winsocket name 'WSAGetOverlappedResult'; 1671 function WSAEventS 1672 external winsocket name 'WSAEventSelect'; 1673 function WSAEnumNetworkE 1674 external winsocket name 'WSAEnumNetworkEvents'; 1675 function WSACreateE 1676 external winsocket name 'WSACreateEvent'; 1677 function WSAC 1678 external winsocket name 'WSAConnect'; 1679 function WSACloseE 1680 external winsocket name 'WSACloseEvent'; 1681 function WSAA 1682 external winsocket name 'WSAAccept'; 1683 1684 function TransmitF 1685 external winsocket name 'TransmitFile'; 1686 1687 end.
winsock2.pas
&参考资料:
&&&&& 【完成端口详解】http://blog.csdn.net/piggyxp/article/details/6922277
&&&&& 【TCP的那些事】/articles/11564.html
转:/article/detail_103311.html
阅读(2283) | 评论(0) | 转发(0) |
下一篇:没有了
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 sockaddr storage 的文章

 

随机推荐