Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Socket Fehler 10051. Im Thread Verbindung aufbauen. (https://www.delphipraxis.net/120266-socket-fehler-10051-im-thread-verbindung-aufbauen.html)

Thomas83 8. Sep 2008 11:35


Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
hi,

habe mir eine Client / Server Anwendung geschrieben.
Weis nicht wie ich es anders Programmieren soll.

Habe da einen Thread. Der in etwa so aufgebaut ist.
Delphi-Quellcode:
repeat
begin
  if not client.active then
  begin
    client.close;
    client.open;
    while not client.socket.connected do
    begin
      sleep(1);
      client.active := true;
      application.processmessage;
    end;
end until Terminated;
end;
Wenn die While Schleife ein paar mal durchgelaufen ist bekomme ich diese Meldung
Zitat:

Im Projekt ClientTest.exe ist eine Exception der Klasse ESocketError aufgetreten. Meldung: 'Windows-Socket-Fehler: Ein Socketvorgang konnte nicht ausgeführt werden, da dem System Pufferspeicher fehlte oder eine Warteschlange voll war (10055), auf API 'connect'. Prozess wurde angehalten.
Hat einer eine Idee wie ich es anders Programmieren kann?
Sobald die Verbindung zum Server nicht mehr steht. Soll der Client versuchen die Verbindung wieder auf zubauen. Kommt vom Ping kein Pong zurück Active = false. Wird der Server beendet Active = false.
Vielleicht hat ja jemand noch eine Idee.
thx

sirius 8. Sep 2008 17:07

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
Du bist in einem Thread? Dann funktioniert das so nicht. Du brauchst eine Messageschleife. Und auf Application darfst du gleich gar nicht zugreifen.

Thomas83 9. Sep 2008 08:09

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
ok das application.processmessage kann ich ja weg lassen.
client ist eine private Variable vom Thread die ich später vor aufruf des Thread zu weise.

stehe gerade auf dem Schlauch :gruebel:

sirius 9. Sep 2008 10:39

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
Client ist ja anscheinend eine Socket-Komponente. Diese benutzt i.A. ein (unsichtbares) Fenster. Deswegen musst du:
  1. Diese Komponente im Thread (in Execute) erstellen und auch wieder löschen
  2. eine Messageschleife einbauen
Aber ich kenne dein Objekt nicht. Deswegen kann ich keine sichere Aussage treffen.

Thomas83 9. Sep 2008 10:43

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
so sieht mein Thread objekt aus
Delphi-Quellcode:
  TClientConnectorThread = class(TThread)
  private
    fCS : TCriticalSection;
    fClient : TClientSocket;
  public
    Procedure SetClientData(Client : TClientSocket);
  protected
    Procedure Execute; override;
  end;
 
//...

procedure TClientConnectorThread.SetClientData(Client: TClientSocket);
begin
  fClient := Client;
end;

procedure TClientConnectorThread.Execute;
begin
  inherited;
  fCS := TCriticalSection.Create;
 
  //while true do
  repeat
  begin
    if not fClient.Active then
    begin
      fCS.Enter;
      fClient.Close;
 
      fClient.Open;
      fClient.Active := true;
      while not fClient.Socket.Connected do
      begin
        sleep(1);
        fClient.Active := true;
        application.ProcessMessages;
      end;
      fCS.Leave;
    end;
    sleep(1);
  end until Terminated;
 
  fCS.Free;
end;

Thomas83 9. Sep 2008 10:44

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
oder ich müste den Thread so umschreiben, das er den verbindungsaufbau und das Senden / Empfangen übernimmt, oder?

sirius 11. Sep 2008 12:05

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
Zitat:

Zitat von Thomas83
oder ich müste den Thread so umschreiben, das er den verbindungsaufbau und das Senden / Empfangen übernimmt, oder?

Ja. Entweder alles oder nichts im Thread.

Die Frage ist, ob du die Komponente nicht schon so einstellen kannst, dass sie intern einen Thread verwendet. Meines Wissens macht sie das sogar automatisch.

Thomas83 11. Sep 2008 14:09

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
aber die Sockets bauen keine Verbindung automatisch auf, wenn diese getrennt wurde.
Daher muss ich ja die Verbindung überwachung und in einen Thread auslagern, oder?

Habe nur bedenken und zwar, der Server vekommt vom Client ein Befehl "MacheWas". Der Server fürt den Befehl aus. Da die Methode "MachWas" aber länger braucht können keine Daten vom Client mehr empfangen werden. Deswegen wollte ich das in einen Thread auslagern. So das die Daten die gesendet werden sollen in einen Thread geschrieben werden und die daten die Empfangen werden auch in einen Thread geschrieben werden. So kann die Anwendung andere Dinge erledigen und im Hintergrund sendet und empfängt ein Thread.

Für Ideen bin ich jeder Zeit offen.

sirius 11. Sep 2008 14:37

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
Ja, lager es in einen Thread aus. Ich weiß es jetzt auch nicht besser (wenn es überhaipt etwas besseres gäbe).

aber dein oben geposteter Thread klappt so nicht.
  1. Application.Processmessages brauchst du nicht aufrufen, dafür hast du ja den Thread. Und generell ist Application global, deswegen nicht vom Thread auf diese Variablen zugreifen.
  2. Die Critical Section ist auch falsch angelegt. Die muss nunmal ausnahmsweise global sein (oder besser: du übergibst eine Referenz auf das Objekt dem Thread), da alle Threads darauf zugreifen müssen (und zwar auf die gleiche Instanz der Klasse).
    Außerdem sehe ich in dem Code noch nicht die Notwendigkeit einer CS.
  3. Erstelle die Socketkomponente im Thread und mache alles über den Thread
  4. Implementiere eine Messageschleife:
    Delphi-Quellcode:
    while getmessage(msg,0,0,0) do dispatchmessage(msg)
    , oder so ähnlich
  5. Alternativ zur Messageschleife kannst du den Client auch auf Blocking-Mode stellen (Socket.clienttype:=ctBlocking), aber ob das durchängig sinnvoll ist, mag ich jetzt nicht abschätzen. Zumindest bleibt dann der Thread beim Empfang stehen, solange es nichts zu empfangen gibt und kein fehler aufgetreten ist.

Thomas83 15. Sep 2008 12:08

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.
 
ok werde meine Client komplett in einen Thread auslagern.
Was aber muss ich mit getmessage für eine Nachricht abfangen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 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