Einzelnen Beitrag anzeigen

Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#1

Fehler 10055 auf API 'connect'

  Alt 30. Jun 2004, 08:14
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 <> '0then 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
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat