Beispiel für Event (ist leider nicht so chic wie bei Astat)
Delphi-Quellcode:
uses
Windows,
Winsock;
// aus WinSock2
type WSAevent=THandle;
function WSACreateEvent:WSAEvent;stdcall;
external 'ws2_32.dll' name 'WSACreateEvent';
function WSACloseEvent(hEvent:WSAevent):bool;stdcall;
external 'ws2_32.dll' name 'WSACloseEvent';
function WSAResetEvent(hEvent: WSAEvent):bool;stdcall;
external 'ws2_32.dll' name 'WSAResetEvent';
function WSAEventSelect(s:TSocket;hEventObject:WSAevent;lNetworkEvents:LongInt):Integer; stdcall;
external 'ws2_32.dll' name 'WSAEventSelect';
function WSAWaitForMultipleEvents(cEvents:DWord;
lphEvents:Pointer;
fWaitAll:bool;
dwTimeOUT:DWord;
fAlertable:bool):DWord;stdcall;
external 'ws2_32.dll' name 'WSAWaitForMultipleEvents';
var
SockAddr1:TSockAddr= (sin_family:af_Inet;
sin_port:$0020; //=8192
sin_addr:(S_addr:$0100007F)); //home
SockAddr2:TSockAddr= (sin_family:af_Inet;
sin_port:$0120; //=8193
sin_addr:(S_addr:$0100007F));
const WSA_WAIT_EVENT_0 = WAIT_OBJECT_0;
procedure main;
var wsaData:TwsaData;
SockEvent:array[1..2] of WSAEvent;
Socket1,Socket2:TSocket;
WSAresult:Integer;
buf:array[0..511] of char;
begin
WSAStartUp(MakeWord(2,0),WSAData);
Socket1:=Socket(af_Inet,Sock_Stream,IPProto_TCP);
SockAddr1.sin_addr.S_addr:=inet_addr('127.0.0.1');
Connect(Socket1,SockAddr1,sizeof(TSockAddr));
SockEvent[1]:=WSACreateEvent;
WSAEventSelect(Socket1,SockEvent[1],FD_Read);
Socket2:=Socket(af_Inet,Sock_Stream,IPProto_TCP);
Connect(Socket2,SockAddr2,sizeof(TSockAddr));
SockEvent[2]:=WSACreateEvent;
WSAEventSelect(Socket2,SockEvent[2],FD_Read);
repeat
WSAResult:=WSAWaitForMultipleEvents(2,@SockEvent,false,infinite,false);
case WSAResult of
WSA_WAIT_EVENT_0 : begin
recv(Socket1,buf,512,0);
if buf='exit' then break;
end;
WSA_WAIT_EVENT_0+1:begin
recv(Socket2,buf,512,0);
end;
else
break;
end;
WSAresetEvent(SockEvent[WSAResult-WSA_Wait_Event_0+1]);
until false;
WSACloseEvent(SockEvent[1]);
WSACloseEvent(SockEvent[2]);
WSACleanUp;
end;
begin
main;
end.
Die Funktionen aus der WinSock2 musste ich reinschreiben, da in D7 diese
Unit nicht existiert. In neueren Delphis muss man
Imho nur Winsock2 einbauen und kann sich die Deklaration der WSAxxx-funktionen sparen.
Edit: Natürlich fehlt die komplette Fehlerbehandlung. Soll ja auch nur ein Beispiel sein.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.