TTCPServer nur 10 Verbindungen
Hallo die Damen und Herren,
vor vielen Monden habe ich eine Anwendung entwickelt, welche über TTCPServer Daten empfängt. Die Anwendung wurde für Windows XP entwickelt. Hier gab es das Problem, dass nur 10 Verbindungen akzeptiert worden sind. Daraufhin habe ich den Quellcode angepasst:
Delphi-Quellcode:
Danach hat die Sache über Jahre super funktioniert.
Srv.ServerSocketThread.ThreadCacheSize:= ThreadCacheSize; // ThreadCacheSize = 24
Srv.LocalPort:= InttoStr(MasterPort); //MasterPort = 5888 Srv.Active:= true; Nun soll die Anwendung unter Windows 7 / Windows Server 2008R2 genutzt werden. Jedoch werden jetzt nur wieder 10 Verbindungen akzeptiert. Der BlockMode steht auf mbThreadBlocking Die Daten werden in dem Event onAccept verarbeitet. Ich arbeite aktuelll mit Delphi 2010 Prof. Kann mir hier jemand helfen? Über eine positive Rückmeldung würde ich mich sehr freuen. |
AW: TTCPServer nur 10 Verbindungen
Liest sich wie ein Design Problem, zeigsta Source?
|
AW: TTCPServer nur 10 Verbindungen
Vielen Dank für die Schnelle Antwort.
Das Event OnAccept wird ab dem Client Nummer 11 nicht mehr aufgerufen. Der Client erhält die Fehlernummer 10061.
Delphi-Quellcode:
procedure TFMain.srvAccept(Sender: TObject; ClientSocket: TCustomIpClient);
var _trans: trans; rec, rec2: integer; sync: TSyncThread; Image: TImage; _Label: TLabel; i: integer; Comp: TComponent; bild: TMemoryStream; ini: TIniFile; VNCTemp: String; Err: Integer; buff: array[0..2048] of byte; jpg: TJpegImage; //Bei starten des Thread ist WaitForData False WaitForData: integer; begin Logger('Verbindung wurde akzeptiert: ' + ClientSocket.RemoteHost); Image:= nil; _Label:= nil; bild:= TMemoryStream.Create(); try ini:= TIniFile.Create(INIFile); VNCTemp:= ini.ReadString('VNC', 'Template', ''); CopyFile(PChar(VNCTemp + '\config.vnc'), PChar(VNCTemp + '\' + clientSocket.RemoteHost + '.vnc'), false); ini.Free(); ini:= TIniFile.Create(VNCTemp + '\'+ clientSocket.RemoteHost + '.vnc'); ini.WriteString('connection', 'host', clientSocket.RemoteHost); ini.Free(); except on E: Exception do begin Logger('srvAccept: config.vnc konnnte nicht kopiert werden. Fehler: ' + E.Message); end; end; while clientSocket.Connect = true do begin fillchar(_trans, sizeof(_trans), 0); rec:= 0; while rec <> sizeof(_trans) do begin //CHG-002 if ClientSocket.WaitForData(15000) = false then begin logger('WaitForData is false'); ClientSocket.Close; end; sleep(10); rec2:= ClientSocket.PeekBuf(buff[rec], sizeof(_trans)-rec); //--CHG-002 ende if rec2 = 0 then begin ClientSocket.Close; break; end; if rec2 <> sizeof(_trans) then begin logger('Windows MSG: ' + SysErrorMessage(GetLastError)); logger('srvAccept: TCP/IP Grösse der Pakete stimmt nicht: ' + ClientSocket.RemoteHost); logger('Empfangen: ' + inttostr(rec2)); logger('Erwartet : ' + inttostr(sizeof(_trans))); fillchar(_trans, 0, sizeof(_trans)); sleep(100); //CHG-003 logger('Versuches es nochmals ...'); rec2:= ClientSocket.ReceiveBuf(buff[rec], sizeof(_trans)-rec); if rec2 <> sizeof(_trans) then begin logger('Wieder keine Daten ... schiessen der Verbindung'); ClientSocket.Close; break; end; logger('Die Daten wurde vollständig empfangen'); //CHG-003 Ende end else begin //CHG-002 rec2:= ClientSocket.ReceiveBuf(buff[rec], sizeof(_trans)-rec); end; rec:= rec + rec2; end; move(buff, _trans, sizeof(_trans)); if _trans.product <> PRODUCT then begin Sync:= TSyncThread.Create(true); logger('srvAccept: Falsche Paketart PRODUCT, Verbindung beendet: ' + ClientSocket.RemoteHost); clientSocket.Disconnect; sync.setPicture(Image, nil); Sync.Suspended:= false; exit; end; if _trans.seg = 0 then begin Bild.Position:= 0 ; Bild.Clear; end; Bild.Write(_trans.data, _trans.size); if _trans.seg = _trans.maxseg then begin //logger('Paket wurde komplett empfangen'); bild.Position:= 0; for i:= 0 to MAXIPHASH do begin if IPHash[i].DesktopID = StrtoInt(_trans.whois) then begin IPHash[i].IPAddr:= ClientSocket.RemoteHost; end; end; if Image = NIL then begin for i:= 0 to FMain.ComponentCount -1 do begin Comp:= FMain.Components[i]; if Comp is TImage then begin if Comp.Tag = StrtoInt(_trans.whois) then Image:= (comp as TImage) end; if comp is TLabel then begin if comp.tag = strtoint(_trans.whois) then _label:= (comp as TLabel); end; end; end; if Image <> NIL then begin try Sync:= TSyncThread.Create(true); //02.05.2010 CHG-002 Sync.FreeOnTerminate:= true; //CHG-002 Ende sync.setPicture(Image, bild); Sync.Suspended:= false; if _trans.user <> '' then _Label.Caption:= _trans.user; //logger('Bild Sync ende.'); except on e: Exception do begin Logger('Sync.SetPicture: ' + e.Message); end; end; end; end; end; // End connected Sync:= TSyncThread.Create(true); sync.setPicture(Image, nil); Sync.Suspended:= false; _Label.Caption:= ''; Logger('srvAccept: Thread mit der IP: ' + clientSocket.RemoteHost + ' wurde geschlossen'); end; // End Function |
AW: TTCPServer nur 10 Verbindungen
Welchen Teil vom Soure benötigst du genau, das Projekt ist etwas größer.
Grüsse martiS |
AW: TTCPServer nur 10 Verbindungen
Gab/Gibt es in neueren Windows-Versionen nicht eine Option die zu viele gleichzeitige Verbindungen einer Anwendung verhindert?
Diese wurde eingeführt um es SPAM/Zombi-Rechnern zu erschweren zu viel Datenmüll ins Internet zu verbreiten. |
AW: TTCPServer nur 10 Verbindungen
Ich habe die Anwendung unter Windows 7 Porf. und Windows Server 2008 R2 Enterprise gestartet.
Beide System reagieren gleich max. 10 Verbindungen. Bei einem Windows Server 2008 R2 Enterprise kann ich mir diese Feature nicht vorstellen. Es ist ja ein Server und ein Server sollte mehr als 10 Clients zeitgleich angesprochen werden können? Ich habe im Netz einige Beträge zum Thema 10-half-open Connections gefunden und ein Programm TCP-Z, welches wohl den TCP/IP Stack modifiziert. Das Programm brachte keine Verbesserung? |
AW: TTCPServer nur 10 Verbindungen
Zitat:
Hatten schon den Fall das diese Bremse auch den MS SQL-Server ausgebremst hatte. Aber schau mal ober der Registry-Key der Diskussion http://www.defense.at/forum/1185-beg...it-xp-sp2.html was hilft. |
AW: TTCPServer nur 10 Verbindungen
Zitat:
ThreadCacheSize: Vermute hier einmal, dass Du die ThreadCacheSize meinst, und diese irrtümlich mit einer Limitierung der maximal möglichen Verbindungen gleichgesetzt hast. Dies kann jedoch nicht sein, da ThreadCacheSize nur dafür sorgt, dass bei eingehenden Clientverbindungen nicht jedes mal sehr kostenintensive Threaderstellungen und Aufräumarbeiten durchgeführt werden müssen. Ab Windows XP, Server 2003, und bei allen weiter nachfolgenden Microsoft Betriebssystemen, wurde eine Wurmbremse im Netzwerktreiber der tcpip.sys, implementiert. Dadurch wird wirksam verhindert, dass gleichzeitig nicht mehr als 10 ausgehende, halboffene Verbindungen (SYN_SENT), für eine bestimmte Applikation (Prozess), möglich sind. Verbindungsanforderungen an Server sind hiervon nicht betroffen, auch nicht ausgehende Verbindungen, die „ein Gegenüber“ (ESTABLISHED) haben. Dies wird fälschlicherweise sehr oft als Limitierung von Netzwerk Verbindungen interpretiert. Tatsache ist, dass diese Limitierung, nur für halboffene, ausgehende Verbindungen gilt. Für Verbindungen zu einem Server, bestehen bei einer Standard OS Installation, keine Limitierung. Auch Verbindungsanfragen eines Clients zu vielen bestehenden Servern ist problemlos möglich. Problematisch sind somit nur Clientanfragen an mehr als 10 Server, die nicht existieren (z.B. Würmer die ganze IP Ranges durchscannen), „normale Verbindungen“, sind nicht betroffen. Fehlernummer 10061: Ja, hier macht die Server Anwendung dicht, vermute mal das sich da was verbröselt. Also: 1. Server Application mit Prozessmonitor und TCPView abchecken. 2. Die Ini, und Logdateien Schreibereien überprüfen, ob dies unter Win7 funktionieren. lg. |
AW: TTCPServer nur 10 Verbindungen
Mit TCPView werden 15 Verbindungen angezeigt mit dem Status "ESTABLISHED" jedoch wir die onAccept Prozedur nur 10 mal ausgeführt?
Was aber nach meier Meinung nicht OK ist: Die ersten Verbindungen werden mit der richtigen RemoteAdress angezeit (Hostname). W7-RAUM1-1, W7-RAUM1-2 ... W7-RAUM1-10. Ab der Verbindung mit der Nummer 11 werden die falschen RemoteAdresses angezeigt. In der Regel welche, die schon in Verwendung sind z.B. W7-RAUM1-2. |
AW: TTCPServer nur 10 Verbindungen
Mit netstat ist die Zuordnung der Hostnamen OK:
TCP 10.10.20.16:58888 W7-RAUM1-1:49178 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-2:49193 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-3:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-4:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-6:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-5:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-7:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-8:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-9:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-15:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-14:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-13:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-12:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-11:49163 HERGESTELLT TCP 10.10.20.16:58888 W7-RAUM1-10:49163 HERGESTELLT |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 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