6 KOL
, Windows
, Messages
, Winsock
;
9 WM_SOCKET
= WM_USER
+ $7000;
10 WM_SOCKETERROR
= WM_USER
+ $7001;
11 WM_SOCKETCLOSE
= WM_USER
+ $7002;
12 WM_SOCKETREAD
= WM_USER
+ $7003;
13 WM_SOCKETCONNECT
= WM_USER
+ $7004;
14 WM_SOCKETACCEPT
= WM_USER
+ $7005;
15 WM_SOCKETWRITE
= WM_USER
+ $7006;
16 WM_SOCKETOOB
= WM_USER
+ $7007;
17 WM_SOCKETLISTEN
= WM_USER
+ $7008;
18 WM_SOCKETLOOKUP
= WM_USER
+ $7009;
20 EVENTS_DOLISTEN
= FD_CLOSE
OR FD_ACCEPT
;
21 EVENTS_DOCONNECT
= FD_CONNECT
OR FD_CLOSE
OR FD_READ
;
22 EVENTS_SETSOCKETHANDLE
= FD_READ
OR FD_CLOSE
OR FD_CONNECT
;
29 INVALID_SOCKET
= winsock
.INVALID_SOCKET
;
33 TWndMethod
= procedure(var Message: TMessage
) of object;
36 ThWnd
= object( TObj
)
39 destructor Destroy
; virtual;
41 property Handle
: hWnd read m_hWnd
;
44 PAsyncSocket
=^TAsyncSocket
;
45 TKOLSocket
= PAsyncSocket
;
52 SocketDataSize
: LongInt;
53 SocketNumber
: Longint;
54 SocketAddress
: PAsyncSocket
);
66 pHostStruct
: Pointer);
69 TBArray
= array[0..65534] of byte;
76 TSocketMessageEvent
= procedure (SocketMessage
: TWMSocket
) of object;
78 TAsyncSocket
= object( TObj
)
79 m_SockAddr
: TSockAddr
;
85 FDnsBuffer
: array [0..MAXGETHOSTSTRUCT
] of char;
87 FOnError
: TSocketMessageEvent
;
88 FOnLookup
: TSocketMessageEvent
;
89 FOnAccept
: TSocketMessageEvent
;
90 FOnClose
: TSocketMessageEvent
;
91 FOnConnect
: TSocketMessageEvent
;
92 FOnRead
: TSocketMessageEvent
;
93 FOnWrite
: TSocketMessageEvent
;
94 FOnListen
: TSocketMessageEvent
;
95 FOnOOB
: TSocketMessageEvent
;
98 destructor Destroy
; virtual;
101 function GetCount
: LongInt;
102 function GetPortNumber
: LongInt;
103 function GetIPAddress
: String;
104 function ErrorTest(Evaluation
: LongInt): LongInt;
106 procedure AllocateSocket
;
107 procedure KillWinsockBug
;
108 procedure SetPortNumber(NewPortNumber
: LongInt);
109 procedure SetIPAddress(NewIPAddress
: String);
110 procedure SetSocketHandle(NewSocketHandle
: TSocket
);
111 function GetConnected
: boolean;
115 procedure HWndProcedure(var Message: TMessage
);
117 procedure Message_Error(var Message: TWMSocket
);
118 procedure Message_Lookup(var Message: TWMSocket
);
119 procedure Message_Close(var Message: TWMSocket
);
120 procedure Message_Accept(var Message: TWMSocket
);
121 procedure Message_Read(var Message: TWMSocket
);
122 procedure Message_Connect(var Message: TWMSocket
);
123 procedure Message_Write(var Message: TWMSocket
);
124 procedure Message_OOB(var Message: TWMSocket
);
125 procedure Message_Listen(var Message: TWMSocket
);
126 procedure DoReceive(Buffer
: Pointer; var ReceiveLen
: LongInt);
127 procedure DoFinal(Abort
: boolean);
130 procedure ProcessMessages
;
131 function DoGetHostByAddr(IPAddr
: PChar
): String;
132 function DoGetHostByName(Name
: PChar
): String;
134 procedure DoLookup(host
: string);
136 procedure DoSend(Buffer
: Pointer; var SendLen
: LongInt);
139 procedure DoAccept(var AcceptSocket
: PAsyncSocket
);
141 procedure SendString(fString
: String);
143 function ReadData(b
: pointer; c
: integer): integer;
144 function ReadLine(c
: char): string; overload
;
145 function ReadLine(c
: char; t
: integer): string; overload
;
146 function ErrToStr(Err
: LongInt): String;
147 function LocalIP
: String;
148 function LocalPort
: integer;
150 property SocketHandle
: TSocket read m_Handle write SetSocketHandle
;
151 property IPAddress
: String read GetIPAddress write SetIPAddress
;
152 property PortNumber
: LongInt read GetPortNumber write SetPortNumber
;
153 property Count
: LongInt read GetCount
;
154 property Connected
: boolean read GetConnected
;
155 property DNSResult
: string read fDNSResult write fDNSResult
;
157 property OnError
: TSocketMessageEvent read FOnError write FOnError
;
158 property OnLookup
: TSocketMessageEvent read FOnLookup write FOnLookup
;
159 property OnAccept
: TSocketMessageEvent read FOnAccept write FOnAccept
;
160 property OnClose
: TSocketMessageEvent read FOnClose write FOnClose
;
161 property OnConnect
: TSocketMessageEvent read FOnConnect write FOnConnect
;
162 property OnRead
: TSocketMessageEvent read FOnRead write FOnRead
;
163 property OnWrite
: TSocketMessageEvent read FOnWrite write FOnWrite
;
164 property OnOOB
: TSocketMessageEvent read FOnOOB write FOnOOB
;
165 property OnListen
: TSocketMessageEvent read FOnListen write FOnListen
;
168 function NewThWnd(WndMethod
: TWndMethod
): PhWnd
;
169 function NewAsyncSocket
: PAsyncSocket
;
172 InstanceCount
: LongInt = 0;
181 Result
.m_hWnd
:= AllocateHWnd(WndMethod
);
182 end; // constructor ThWnd.Create(WndMethod: TWndMethod)
184 destructor ThWnd
.Destroy
;
186 DeallocateHWnd(m_hWnd
);
190 function NewAsyncSocket
;
192 TempWSAData
: TWSAData
;
194 InstanceCount
:= InstanceCount
+ 1;
196 if (InstanceCount
= c_FIRST
) then
197 Result
.ErrorTest(WSAStartup($101, TempWSAData
));
198 Result
.KillWinsockBug
;
199 Result
.m_Handle
:= INVALID_SOCKET
;
200 Result
.m_SockAddr
.sin_family
:= AF_INET
;
201 Result
.m_SockAddr
.sin_addr
.s_addr
:= INet_Addr('0.0.0.0');
202 Result
.PortNumber
:= 0;
203 Result
.FList
:= NewList
;
204 Result
.m_hWnd
:= NewThWnd(Result
.HWndProcedure
);
205 end; // constructor TAsyncSocket.Create
207 function TAsyncSocket
.GetCount
;
212 for i
:= 0 to FList
.Count
- 1 do begin
214 result
:= result
+ t
^.i
;
218 function TAsyncSocket
.ReadData
;
225 if FList
.count
= 0 then begin
231 while (n
< c
) and (n
< count
) do begin
234 if r
> t
^.i
then r
:= t
^.i
;
235 move(t
^.p
^, a
^[n
], r
);
237 if r
= t
^.i
then begin
239 FreeMem(t
, SizeOf(TBufRecord
));
242 GetMem(u
, SizeOf(TBufRecord
));
245 move(t
^.p
^[r
], u
^.p
^, u
^.i
);
247 FreeMem(t
, SizeOf(TBufRecord
));
254 function TAsyncSocket
.ReadLine(c
: char): string;
263 if count
= 0 then exit
;
264 for i
:= 0 to FList
.Count
- 1 do begin
266 for j
:= 0 to t
^.i
- 1 do begin
268 if chr(t
^.p
^[j
]) = c
then begin
271 ReadData(@s
[1], n
- 1);
286 function TAsyncSocket
.ReadLine(c
: char; t
: integer): string;
292 while (result
= '') and (longint(gettickcount
) < tt
+ t
* 1000) do begin
293 if PeekMessage(Msg
, m_hWnd
.m_hWnd
, 0, 0, PM_REMOVE
) then begin
294 DispatchMessage(Msg
);
296 result
:= ReadLine(c
);
297 if m_Handle
= INVALID_SOCKET
then exit
;
301 function TAsyncSocket
.GetIPAddress
: String;
303 Result
:= INet_NToA(m_SockAddr
.sin_addr
);
304 end; // function TAsyncSocket.GetIPAddress: String
306 function TAsyncSocket
.GetPortNumber
: LongInt;
308 Result
:= NToHS(m_SockAddr
.sin_port
);
309 end; // function TAsyncSocket.GetPortNumber: Word
311 procedure TAsyncSocket
.AllocateSocket
;
313 if (m_Handle
= INVALID_SOCKET
) then
315 m_Handle
:= ErrorTest(socket(AF_INET
, SOCK_STREAM
, 0));
316 end; // if (m_Handle = INVALID_SOCKET) then
317 end; // procedure TAsyncSocket.AllocateSocket
319 procedure TAsyncSocket
.SetSocketHandle(NewSocketHandle
: TSocket
);
322 m_Handle
:= NewSocketHandle
;
323 ErrorTest(WSAAsyncSelect(m_Handle
, m_hWnd
.Handle
, WM_SOCKET
, EVENTS_SETSOCKETHANDLE
));
324 end; // procedure TAsyncSocket.SetSocketHandle(NewSocketHandle: TSocket)
326 function TAsyncSocket
.GetConnected
;
328 result
:= fConnected
;
331 function TAsyncSocket
.ErrorTest(Evaluation
: LongInt): LongInt;
333 TempMessage
: TWMSocket
;
335 if ((Evaluation
= SOCKET_ERROR
) OR (Evaluation
= INVALID_SOCKET
)) then
337 TempMessage
.Msg
:= WM_SOCKETERROR
;
338 TempMessage
.SocketError
:= WSAGetLastError
;
339 TempMessage
.SocketNumber
:= m_Handle
;
340 TempMessage
.SocketAddress
:= @self
;
341 Message_Error(TempMessage
);
342 Result
:= Evaluation
;
343 end // if ((Evaluation = SOCKET_ERROR) OR (Evaluation = INVALID_SOCKET)) then
345 Result
:= Evaluation
;
346 end; // function ErrorTest(Evaluation: LongInt): LongInt;
348 procedure TAsyncSocket
.KillWinsockBug
;
353 // For an unknown reason, if a call is made to GetHostByName and it should
354 // fail, the following call to GetHostByAddr will not fail, but return '>'
355 // in the place of the host name. This clears the problem up.
357 GetHostByAddr(@Addr
, SizeOf(Integer), PF_INET
);
361 procedure TAsyncSocket
.SetIPAddress(NewIPAddress
: String);
363 pTempHostEnt
: PHostEnt
;
365 m_SockAddr
.sin_addr
.s_addr
:= INet_Addr(PChar(NewIPAddress
));
366 if (m_SockAddr
.sin_addr
.s_addr
= u_long(INADDR_NONE
)) then
368 pTempHostEnt
:= GetHostByName(PChar(NewIPAddress
));
369 if (pTempHostEnt
<> Nil) then
370 m_SockAddr
.sin_addr
.s_addr
:= PInAddr(pTempHostEnt
^.h_addr_list
^)^.s_addr
;
372 end; // procedure TAsyncSocket.SetIPAddress(NewIPAddress: String)
374 procedure TAsyncSocket
.SetPortNumber(NewPortNumber
: LongInt);
376 if ((NewPortNumber
> 0) AND (NewPortNumber
<= MaxWord
)) then
377 m_SockAddr
.sin_port
:= HToNS(NewPortNumber
);
378 end; // procedure TAsyncSocket.SetPortNumber(NewPortNumber: Word)
380 procedure TAsyncSocket
.DoReceive(Buffer
: Pointer; var ReceiveLen
: LongInt);
382 ReceiveLen
:= recv(m_Handle
, Buffer
^, ReceiveLen
, 0);
383 ErrorTest(ReceiveLen
);
384 end; // TAsyncSocket.DoReceive(Buffer: Pointer; BufferLen: LongInt)
386 procedure TAsyncSocket
.DoSend(Buffer
: Pointer; var SendLen
: LongInt);
388 SendLen
:= send(m_Handle
, Buffer
^, SendLen
, 0);
390 end; // procedure TAsyncSocket.DoSend(Buffer: Pointer; BufferLen: LongInt)
392 procedure TAsyncSocket
.DoLookup
;
396 if Host
= '' then begin
400 { Cancel any pending lookup }
401 if FDnsHandle
<> 0 then
402 WSACancelAsyncRequest(FDnsHandle
);
406 IPAddr
.S_addr
:= Inet_addr(PChar(Host
));
407 if IPAddr
.S_addr
<> u_long(INADDR_NONE
) then begin
408 FDnsResult
:= inet_ntoa(IPAddr
);
409 { TriggerDnsLookupDone(0);}
413 FDnsHandle
:= WSAAsyncGetHostByName(m_hWnd
.Handle
,
418 if FDnsHandle
= 0 then begin
419 ErrorTest(WSAGetLastError
);
424 procedure TAsyncSocket
.DoClose
;
429 procedure TAsyncSocket
.DoFinal
;
431 TempMessage
: TWMSocket
;
433 if (m_Handle
<> INVALID_SOCKET
) then begin
434 if not Abort
then begin
437 TempMessage
.Msg
:= WM_SOCKETCLOSE
;
438 TempMessage
.SocketNumber
:= m_Handle
;
439 TempMessage
.SocketAddress
:= @self
;
440 Message_Close(TempMessage
);
441 ErrorTest(closesocket(m_Handle
));
442 m_Handle
:= INVALID_SOCKET
;
446 procedure TAsyncSocket
.DoAccept(var AcceptSocket
: PAsyncSocket
);
450 TempAddr
: TSockAddrIn
;
452 TempSize
:= SizeOf(TSockAddr
);
453 TempSock
:= accept(m_Handle
, @TempAddr
, @TempSize
);
454 AcceptSocket
.m_SockAddr
:= TempAddr
;
455 if (ErrorTest(TempSock
) <> INVALID_SOCKET
) then
456 AcceptSocket
.SocketHandle
:= TempSock
;
457 end; // procedure TAsyncSocket.DoAccept(var AcceptSocket: TAsyncSocket)
459 procedure TAsyncSocket
.DoListen
;
461 TempMessage
: TWMSocket
;
466 (ErrorTest(WSAAsyncSelect(m_Handle
, m_hWnd
.Handle
, WM_SOCKET
, EVENTS_DOLISTEN
))
468 (ErrorTest(bind(m_Handle
, m_SockAddr
, SizeOf(TSockAddr
))) <> SOCKET_ERROR
) AND
469 (ErrorTest(listen(m_Handle
, 5)) <> SOCKET_ERROR
) then
471 TempMessage
.Msg
:= WM_SOCKETLISTEN
;
472 TempMessage
.SocketNumber
:= m_Handle
;
473 TempMessage
.SocketAddress
:= @self
;
474 Message_Listen(TempMessage
);
478 end; // procedure TAsyncSocket.DoListen
480 procedure TAsyncSocket
.DoConnect
;
486 ErrorTest(WSAAsyncSelect(m_Handle
, m_hWnd
.Handle
, WM_SOCKET
, EVENTS_DOCONNECT
));
487 TempResult
:= connect(m_Handle
, m_SockAddr
, SizeOf(TSockAddr
));
488 if ((TempResult
= SOCKET_ERROR
) AND (WSAGetLastError
<> WSAEWOULDBLOCK
)) then
489 ErrorTest(SOCKET_ERROR
);
490 end; // procedure TAsyncSocket.DoConnect
492 procedure TAsyncSocket
.SendString
;
496 L
:= Length(fString
);
497 DoSend(PChar(fString
), L
);
500 function TAsyncSocket
.DoGetHostByName(Name
: PChar
): String;
502 pTempHostEnt
: PHostEnt
;
504 pTempHostEnt
:= GetHostByName(Name
);
505 if (pTempHostEnt
<> Nil) then
506 Result
:= inet_ntoa(pInAddr(pTempHostEnt
^.h_addr_list
^)^)
511 procedure TAsyncSocket
.ProcessMessages
;
514 while PeekMessage(Msg
, m_hWnd
.m_hWnd
, WM_SOCKET
, WM_SOCKETLOOKUP
, PM_REMOVE
) do begin
515 DispatchMessage(Msg
);
519 function TAsyncSocket
.DoGetHostByAddr(IPAddr
: PChar
): String;
521 pTempHostEnt
: PHostEnt
;
524 TempAddr
:= INet_Addr(IPAddr
);
525 pTempHostEnt
:= GetHostByAddr(@TempAddr
, SizeOf(TempAddr
), PF_INET
);
526 if (pTempHostEnt
<> Nil) then
527 Result
:= pTempHostEnt
^.h_name
532 procedure TAsyncSocket
.HWndProcedure(var Message: TMessage
);
534 TempMessage
: TWMSocket
;
539 TempMessage
.Msg
:= WM_SOCKETLOOKUP
;
540 TempMessage
.SocketNumber
:= m_Handle
;
541 TempMessage
.SocketAddress
:= @self
;
542 Message_Lookup(TempMessage
);
546 if (Message.LParamHi
> WSABASEERR
) then
548 WSASetLastError(Message.LParamHi
);
549 ErrorTest(SOCKET_ERROR
);
550 end // if (Message.LParamHi > WSABASEERR) then
553 case Message.LParamLo
of
556 TempMessage
.SocketDataSize
:= 0;
557 ErrorTest(IOCtlSocket(m_Handle
, FIONREAD
, TempMessage
.SocketDataSize
));
558 TempMessage
.Msg
:= WM_SOCKETREAD
;
559 TempMessage
.SocketNumber
:= m_Handle
;
560 TempMessage
.SocketAddress
:= @self
;
561 Message_Read(TempMessage
);
569 TempMessage
.Msg
:= WM_SOCKETCONNECT
;
570 TempMessage
.SocketNumber
:= m_Handle
;
571 TempMessage
.SocketAddress
:= @self
;
572 Message_Connect(TempMessage
);
576 TempMessage
.Msg
:= WM_SOCKETACCEPT
;
577 TempMessage
.SocketNumber
:= m_Handle
;
578 TempMessage
.SocketAddress
:= @self
;
579 Message_Accept(TempMessage
);
583 TempMessage
.Msg
:= WM_SOCKETWRITE
;
584 TempMessage
.SocketNumber
:= m_Handle
;
585 TempMessage
.SocketAddress
:= @self
;
586 Message_Write(TempMessage
);
590 TempMessage
.Msg
:= WM_SOCKETOOB
;
591 TempMessage
.SocketNumber
:= m_Handle
;
592 TempMessage
.SocketAddress
:= @self
;
593 Message_OOB(TempMessage
);
595 end; // case Message.LParamLo of
596 end // else (if (Message.LParamHi > WSABASEERR) then)
599 Message.Result
:= DefWindowProc(m_hWnd
.m_hWnd
, Message.Msg
, Message.WParam
, Message.LParam
);
600 end; // case Message.Msg of
601 end; // procedure TAsyncSocket.HWndProcedure(var Message: TMessage)
603 procedure TAsyncSocket
.Message_Error(var Message: TWMSocket
);
605 if Assigned(FOnError
) then FOnError(Message)
607 MessageBox(HWND_DESKTOP
, PChar(ErrToStr(Message.SocketError
) + ' on socket ' +
608 Int2Str(Message.SocketNumber
)), 'Message_Error', MB_OK
);
609 end; // procedure TAsyncSocket.Message_Error(var Message: TWMSocket)
611 procedure TAsyncSocket
.Message_Lookup(var Message: TWMSocket
);
615 fDNSResult
:= p
.h_name
;
616 if Assigned(FOnLookup
) then FOnLookup(Message)
618 MessageBox(HWND_DESKTOP
, PChar('WM_SOCKETLOOKUP on socket ' + Int2Str(Message.SocketNumber
)),
619 'Message_Lookup', MB_OK
);
620 end; // procedure TAsyncSocket.Message_LookUp(var Message: TWMSocket)
622 procedure TAsyncSocket
.Message_Close(var Message: TWMSocket
);
625 if Assigned(FOnClose
) then FOnClose(Message)
627 MessageBox(HWND_DESKTOP
, PChar('WM_SOCKETCLOSE on socket ' + Int2Str(Message.SocketNumber
)),
628 'Message_Close', MB_OK
);
629 end; // procedure TAsyncSocket.Message_Close(var Message: TWMSocket)
631 procedure TAsyncSocket
.Message_Accept(var Message: TWMSocket
);
634 if Assigned(FOnAccept
) then FOnAccept(Message)
636 MessageBox(HWND_DESKTOP
, PChar('WM_SOCKETACCEPT on socket ' + Int2Str(Message.SocketNumber
)),
637 'Message_Accept', MB_OK
);
638 end; // procedure TAsyncSocket.Message_Accept(var Message: TWMSocket)
640 procedure TAsyncSocket
.Message_Read(var Message: TWMSocket
);
643 if Message.SocketDataSize
> 0 then begin
645 GetMem(t
, sizeof(TBufRecord
));
646 t
^.i
:= Message.SocketDataSize
;
648 DoReceive(t
^.p
, t
^.i
);
651 if Assigned(FOnRead
) then FOnRead(Message)
653 MessageBox(HWND_DESKTOP
, PChar('WM_SOCKETREAD on socket ' + Int2Str(Message.SocketNumber
)),
654 'Message_Read', MB_OK
);
655 end; // procedure TAsyncSocket.Message_Read(var Message: TWMSocket)
657 procedure TAsyncSocket
.Message_Connect(var Message: TWMSocket
);
660 if Assigned(FOnConnect
) then FOnConnect(Message)
662 MessageBox(HWND_DESKTOP
, PChar('WM_SOCKETCONNECT on socket ' + Int2Str(Message.SocketNumber
)),
663 'Message_Connect', MB_OK
);
664 end; // procedure TAsyncSocket.Message_Connect(var Message: TWMSocket)
666 procedure TAsyncSocket
.Message_Write(var Message: TWMSocket
);
669 if Assigned(FOnWrite
) then FOnWrite(Message)
671 MessageBox(HWND_DESKTOP
, PChar('WM_SOCKETWRITE on socket ' + Int2Str(Message.SocketNumber
)),
672 'Message_Write', MB_OK
);
673 end; // procedure TAsyncSocket.Message_Write(var Message: TWMSocket)
675 procedure TAsyncSocket
.Message_OOB(var Message: TWMSocket
);
677 if Assigned(FOnOOB
) then FOnOOB(Message)
679 MessageBox(HWND_DESKTOP
, PChar('WM_SOCKETOOB on socket ' + Int2Str(Message.SocketNumber
)),
680 'Message_OOB', MB_OK
);
681 end; // procedure TAsyncSocket.Message_OOB(var Message: TWMSocket)
683 procedure TAsyncSocket
.Message_Listen(var Message: TWMSocket
);
685 if Assigned(FOnListen
) then FOnListen(Message)
687 MessageBox(HWND_DESKTOP
, PChar('WM_SOCKETLISTEN on socket ' + Int2Str(Message.SocketNumber
)),
688 'Message_Listen', MB_OK
);
689 end; // procedure TAsyncSocket.Message_Listen(var Message: TWMSocket)
691 destructor TAsyncSocket
.Destroy
;
696 if (InstanceCount
= c_FIRST
) then
697 ErrorTest(WSACleanup
);
699 for i
:= 0 to FList
.Count
- 1 do begin
702 FreeMem(t
, SizeOf(TBufRecord
));
705 InstanceCount
:= InstanceCount
- 1;
709 function TAsyncSocket
.ErrToStr(Err
: LongInt): String;
713 Result
:= 'WSAEINTR';
715 Result
:= 'WSAEBADF';
717 Result
:= 'WSAEACCES';
719 Result
:= 'WSAEFAULT';
721 Result
:= 'WSAEINVAL';
723 Result
:= 'WSAEMFILE';
725 Result
:= 'WSAEWOULDBLOCK';
727 Result
:= 'WSAEINPROGRESS';
729 Result
:= 'WSAEALREADY';
731 Result
:= 'WSAENOTSOCK';
733 Result
:= 'WSAEDESTADDRREQ';
735 Result
:= 'WSAEMSGSIZE';
737 Result
:= 'WSAEPROTOTYPE';
739 Result
:= 'WSAENOPROTOOPT';
741 Result
:= 'WSAEPROTONOSUPPORT';
743 Result
:= 'WSAESOCKTNOSUPPORT';
745 Result
:= 'WSAEOPNOTSUPP';
747 Result
:= 'WSAEPFNOSUPPORT';
749 Result
:= 'WSAEAFNOSUPPORT';
751 Result
:= 'WSAEADDRINUSE';
753 Result
:= 'WSAEADDRNOTAVAIL';
755 Result
:= 'WSAENETDOWN';
757 Result
:= 'WSAENETUNREACH';
759 Result
:= 'WSAENETRESET';
761 Result
:= 'WSAECONNABORTED';
763 Result
:= 'WSAECONNRESET';
765 Result
:= 'WSAENOBUFS';
767 Result
:= 'WSAEISCONN';
769 Result
:= 'WSAENOTCONN';
771 Result
:= 'WSAESHUTDOWN';
773 Result
:= 'WSAETOOMANYREFS';
775 Result
:= 'WSAETIMEDOUT';
777 Result
:= 'WSAECONNREFUSED';
779 Result
:= 'WSAELOOP';
781 Result
:= 'WSAENAMETOOLONG';
783 Result
:= 'WSAEHOSTDOWN';
785 Result
:= 'WSAEHOSTUNREACH';
787 Result
:= 'WSAENOTEMPTY';
789 Result
:= 'WSAEPROCLIM';
791 Result
:= 'WSAEUSERS';
793 Result
:= 'WSAEDQUOT';
795 Result
:= 'WSAESTALE';
797 Result
:= 'WSAEREMOTE';
799 Result
:= 'WSASYSNOTREADY';
801 Result
:= 'WSAVERNOTSUPPORTED';
803 Result
:= 'WSANOTINITIALISED';
805 Result
:= 'WSAHOST_NOT_FOUND';
807 Result
:= 'WSATRY_AGAIN';
809 Result
:= 'WSANO_RECOVERY';
811 Result
:= 'WSANO_DATA';
812 else Result
:= 'UNDEFINED WINSOCK ERROR';
814 end; // function TAsyncSocket.ErrToStr(Err: LongInt): String
816 function TAsyncSocket
.LocalIP
;
817 var Name
: TSockAddrIn
;
820 GetSockName(m_Handle
, Name
, len
);
821 Result
:= int2str(ord(Name
.sin_addr
.S_un_b
.s_b1
)) + '.' +
822 int2str(ord(Name
.sin_addr
.S_un_b
.s_b2
)) + '.' +
823 int2str(ord(Name
.sin_addr
.S_un_b
.s_b3
)) + '.' +
824 int2str(ord(Name
.sin_addr
.S_un_b
.s_b4
));
827 function TAsyncSocket
.LocalPort
;
828 var Name
: TSockAddrIn
;
834 err
:= GetSockName(m_Handle
, Name
, len
);
835 if err
= 0 then begin
836 Result
:= NToHS(Name
.sin_port
);
838 Tmp
.Msg
:= WM_SOCKETERROR
;
839 Tmp
.SocketError
:= WSAGetLastError
;
840 Tmp
.SocketNumber
:= m_Handle
;
841 Tmp
.SocketAddress
:= @self
;