![]() |
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:
Funktion, die das Port testet:
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; original von Hagen
Delphi-Quellcode:
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'.
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; 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 |
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:
Ich hoffe das reicht schon, sonst verzögert sich das Problem nur um ein paar Wochen/Monate.
IPClient.Socket.Close;
grüße, daniel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz