Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TTCPServer nur 10 Verbindungen (https://www.delphipraxis.net/163634-ttcpserver-nur-10-verbindungen.html)

martiS 7. Okt 2011 18:25

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:
Srv.ServerSocketThread.ThreadCacheSize:= ThreadCacheSize; // ThreadCacheSize = 24
Srv.LocalPort:= InttoStr(MasterPort); //MasterPort = 5888
Srv.Active:= true;
Danach hat die Sache über Jahre super funktioniert.
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.

Astat 7. Okt 2011 21:10

AW: TTCPServer nur 10 Verbindungen
 
Liest sich wie ein Design Problem, zeigsta Source?

martiS 8. Okt 2011 07:27

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

martiS 8. Okt 2011 07:30

AW: TTCPServer nur 10 Verbindungen
 
Welchen Teil vom Soure benötigst du genau, das Projekt ist etwas größer.

Grüsse

martiS

Bernhard Geyer 8. Okt 2011 10:49

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.

martiS 8. Okt 2011 12:10

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?

Bernhard Geyer 8. Okt 2011 12:17

AW: TTCPServer nur 10 Verbindungen
 
Zitat:

Zitat von martiS (Beitrag 1129314)
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?

Doch das Feature gibt es dort auch (Virus könnte ja jemand per TS eingeschleppt haben).

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.

Astat 9. Okt 2011 02:20

AW: TTCPServer nur 10 Verbindungen
 
Zitat:

Zitat von martiS (Beitrag 1129269)
Welchen Teil vom Soure benötigst du genau, das Projekt ist etwas größer.
......
Daraufhin habe ich den Quellcode angepasst:

Srv.ServerSocketThread.ThreadCacheSize:= ThreadCacheSize; // ThreadCacheSize = 24
.......

Der Client erhält die Fehlernummer 10061.

Ok, hab alles, sehe Du verwendest die TTcpServer Komponente.

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.

martiS 9. Okt 2011 09:05

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.

martiS 10. Okt 2011 09:37

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.
Seite 1 von 2  1 2      

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