AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Socket Fehler 10051. Im Thread Verbindung aufbauen.
Thema durchsuchen
Ansicht
Themen-Optionen

Socket Fehler 10051. Im Thread Verbindung aufbauen.

Ein Thema von Thomas83 · begonnen am 8. Sep 2008 · letzter Beitrag vom 15. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#1

Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 8. Sep 2008, 11:35
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 8. Sep 2008, 17:07
Du bist in einem Thread? Dann funktioniert das so nicht. Du brauchst eine Messageschleife. Und auf Application darfst du gleich gar nicht zugreifen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#3

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 9. Sep 2008, 08:09
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 9. Sep 2008, 10:39
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#5

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 9. Sep 2008, 10:43
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;
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#6

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 9. Sep 2008, 10:44
oder ich müste den Thread so umschreiben, das er den verbindungsaufbau und das Senden / Empfangen übernimmt, oder?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 11. Sep 2008, 12:05
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#8

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 11. Sep 2008, 14:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 11. Sep 2008, 14:37
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: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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Thomas83

Registriert seit: 7. Jan 2008
180 Beiträge
 
#10

Re: Socket Fehler 10051. Im Thread Verbindung aufbauen.

  Alt 15. Sep 2008, 12:08
ok werde meine Client komplett in einen Thread auslagern.
Was aber muss ich mit getmessage für eine Nachricht abfangen?
  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 19:04 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