AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TTCPServer nur 10 Verbindungen
Thema durchsuchen
Ansicht
Themen-Optionen

TTCPServer nur 10 Verbindungen

Ein Thema von martiS · begonnen am 7. Okt 2011 · letzter Beitrag vom 10. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2      
martiS

Registriert seit: 19. Jul 2011
6 Beiträge
 
#1

TTCPServer nur 10 Verbindungen

  Alt 7. Okt 2011, 19:25
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.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#2

AW: TTCPServer nur 10 Verbindungen

  Alt 7. Okt 2011, 22:10
Liest sich wie ein Design Problem, zeigsta Source?
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
martiS

Registriert seit: 19. Jul 2011
6 Beiträge
 
#3

AW: TTCPServer nur 10 Verbindungen

  Alt 8. Okt 2011, 08:27
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

Geändert von martiS ( 8. Okt 2011 um 08:59 Uhr)
  Mit Zitat antworten Zitat
martiS

Registriert seit: 19. Jul 2011
6 Beiträge
 
#4

AW: TTCPServer nur 10 Verbindungen

  Alt 8. Okt 2011, 08:30
Welchen Teil vom Soure benötigst du genau, das Projekt ist etwas größer.

Grüsse

martiS
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TTCPServer nur 10 Verbindungen

  Alt 8. Okt 2011, 11:49
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
martiS

Registriert seit: 19. Jul 2011
6 Beiträge
 
#6

AW: TTCPServer nur 10 Verbindungen

  Alt 8. Okt 2011, 13:10
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TTCPServer nur 10 Verbindungen

  Alt 8. Okt 2011, 13:17
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.
Windows Vista - Eine neue Erfahrung in Fehlern.

Geändert von Bernhard Geyer ( 9. Okt 2011 um 10:34 Uhr)
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#8

AW: TTCPServer nur 10 Verbindungen

  Alt 9. Okt 2011, 03:20
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.
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
martiS

Registriert seit: 19. Jul 2011
6 Beiträge
 
#9

AW: TTCPServer nur 10 Verbindungen

  Alt 9. Okt 2011, 10:05
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.

Geändert von martiS ( 9. Okt 2011 um 15:38 Uhr)
  Mit Zitat antworten Zitat
martiS

Registriert seit: 19. Jul 2011
6 Beiträge
 
#10

AW: TTCPServer nur 10 Verbindungen

  Alt 10. Okt 2011, 10:37
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 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