Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Fehler 10055 auf API 'connect' (https://www.delphipraxis.net/25036-fehler-10055-auf-api-connect.html)

Sanchez 30. Jun 2004 08:14


Fehler 10055 auf API 'connect'
 
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

Sanchez 1. Jul 2004 08:38

Re: Fehler 10055 auf API 'connect'
 
Sieht so aus als läge das Problem nicht an den beiden obigen Funktionen.
Das Problem tritt erst auf, nachdem die Verbindung zum Server mal dar war.

Ich hab aber gerade bemerkt, dass ich nach dem ersten erfolgreichen Verbindungsversuch immer direkt mit dem ClientSocket verbinde. Da hab ich ein Flag übersehen. Jetzt teste ich wieder vor jedem Verbindungsversuch mit obigen Funktionen. Der Test ist zwar noch am laufen, aber schon seit einer Stunde schlägt alle halben Sekunden die Funktion PortPresent fehl und es is noch am laufen.

Allerdings muss da doch ein Fehler bei meinem ClientSocket sein der noch weg muss.

Zur Zeit Schließe ich vor dem jeden Verbindungsversuch den Socket mit:

Delphi-Quellcode:
  IPClient.Socket.Close;
Ich hoffe das reicht schon, sonst verzögert sich das Problem nur um ein paar Wochen/Monate.

grüße, daniel


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz