Hallo zusammen,
Ich hab ein Programm, das rund um die Uhr laufen soll und über mehrere Sockets Werte abfragt.
Da die Rechner, die diese Werte liefern teilweise nachts abgeschalten sind und gelegentlich das dortige Programm (das die Werte liefert) geschlossen und wieder mal geöffnet wird, muss sich mein Programm wieder von selbst verbinden können.
Um das zu realisieren, lass ich alle durch einen Timer einen asynchronen Thread losrennen, der mir meinen den gewünschten Rechner anpingt, und wenn der Ping erfolgreich ist, testet ob das gewünschte Port offen ist.
Funktion, die Pingt:
Delphi-Quellcode:
function Ping(const _IPAdr : string) : boolean;
var
hICMP : DWORD;
pierWork : PICMP_ECHO_REPLY;
dwSize : DWORD;
begin
Result := FALSE;
hICMP := IcmpCreateFile;
if (hICMP = INVALID_HANDLE_VALUE) or (_IPAdr = '0') then exit;
try
dwSize := SizeOf(ICMP_ECHO_REPLY)+8;
pierWork := AllocMem(dwSize);
try
if IcmpSendEcho(hICMP,inet_addr(PChar(_IPAdr)),nil,0,nil,pierWork,dwSize,1000) = 0 then begin
end else begin
Result := TRUE;
end;
finally
FreeMem(pierWork,dwSize);
end;
finally
IcmpCloseHandle(hIcmp);
end;
end;
Funktion, die das Port testet:
original von Hagen
Delphi-Quellcode:
function PortPresent(const _IPAdr : string; Port: DWord): Boolean;
var
S: TSocket;
A: SOCKADDR_IN;
W: TWsaData;
begin
Result := False;
if WsaStartup(MakeWord(1, 1), W) = 0 then begin
if _IPAdr <> '0' then begin
FillChar(A, SizeOf(A), 0);
A.sin_family := AF_INET;
A.sin_addr.S_addr := inet_addr(PChar(_IPAdr));
A.sin_port := htons(Port);
S := Socket(AF_INET, SOCK_STREAM, 0);
if S <> INVALID_SOCKET then begin
Result := WinSock.connect(S, A, SizeOf(A)) = 0;
CloseSocket(S);
end;
end;
end;
WSACleanup;
end;
Irgendwo scheint hier auf alle Fälle der Wurm drinnen zu sein. Nach ein paar Stunden Laufzeit, in der die Verbindung nicht steht kommt bei jeden Verbindungsversuch
Fehler:Windows-Socket-Fehler: Ein Socketvorgang konnte nicht ausgeführt werden, da dem System Pufferspeicher fehlte oder eine Warteschlange voll war (10055), auf API 'connect'.
Bei meinen bisherigen Tests war das der Fall, wenn der Ping erfolgreich war, das Verbinden aufs Port aber fehlgeschlagen ist.
Wie verhindere ich das? Gibt da einen Buffer, den ich leeren sollte?
grüße, daniel