AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TClientSocket funktioniert nicht in einem Thread!?
Thema durchsuchen
Ansicht
Themen-Optionen

TClientSocket funktioniert nicht in einem Thread!?

Offene Frage von "Zacherl"
Ein Thema von override · begonnen am 18. Mär 2007 · letzter Beitrag vom 29. Jun 2007
 
override

Registriert seit: 16. Dez 2006
10 Beiträge
 
Delphi 2005 Personal
 
#1

TClientSocket funktioniert nicht in einem Thread!?

  Alt 18. Mär 2007, 17:12
Hallo Community,

ich habe folgendes Problem:
Ich hab einen Thread erstellt, der nur dafür verwendet wird,
eine Verbindung zu meiner Server-Anwendung herzustellen
und in einer Schleife auf Pakete zu warten.

Angeblich ist der Client verbunden, aber Server-seitig besteht keine Verbindung.
Liegt das vermutlich an dem Blocking-Mode?
In Zeile 65 wird der Thread übrigens im Debugger (ohne Meldung) verlassen,
direkt nach Socket.SendBuf.

Der Code sieht etwas komisch aus - ist momentan noch experimenteller Code.

Delphi-Quellcode:
function TNetThread.MadeConnection(): Boolean;
var
  Buf_: TBuffer;
  FileStream: TFileStream;
  GAME_PATH: String;
begin
  //Init
  GAME_PATH := ExtractFilePath(ParamStr(0));
  //Lade Server-Daten
  FileStream := TFileStream.Create(GAME_PATH+'Server.tmp',fmOpenRead);
  buf_ := TBuffer.Create(0);
  buf_.LoadFromStream(FileStream,Integer(FileStream.Size));
  TCPSock := TClientSocket.Create(nil);
  with TCPSock do begin
    Address := buf_.GetString();
    buf_.GetBuf(@Port,4);
    ClientType := ctNonBlocking;
  end;
  buf_.Free();
  FileStream.Free();
  //Verbinde und warte 1 sec. für Verbindung
  TCPSock.Open();
  //buf_ := TBuffer.Create(1);
  //SendServer(#0,buf_);
  //buf_.Free();
  //Sleep(1000);
  if (TCPSock.Socket.Connected) then begin
    Result := True;
  end
  else Result := False;
end;


procedure TNetThread.Execute();
var
  len: Cardinal;
begin
  //Init
  NetBuf := nil;
  Stream := nil;
  GMNet := nil;
  NetBuf := TBuffer.Create(512);
  //Verbindung zum Server herstellen
  if not MadeConnection then Destroy();
  repeat
    Sleep(100);
  until InGame^;
  if not (TCPSock.Socket.Connected) then Destroy();

  //Empfange Daten
  try
    Stream := TWinSocketStream.Create(TCPSock.Socket,600000); //TimeOut
  except
    Destroy();
    Exit;
  end;

  try
    GMNet := TGMNet.Create();
  except
    Destroy();
    Exit;
  end;
  NetBuf.ResetVars();
  SendServer(NET_INIT,NetBuf);
  
  while (not Terminated) and TCPSock.Socket.Connected do begin
    if Stream.WaitForData(Stream.TimeOut) then begin
      try
        len := NetBuf.LoadFromStream(Stream,512);
        if (len > 0) then begin
          //Buf_.ReSize(len);
          GMNet.RunLines(NetBuf);
        end;
        //else
        // Break;
      except
        Break;
      end;
    end
    else
       TCPSock.Socket.Close;
  end;

  //CleanUp
  Destroy();
end;
Mit freundlichen Grüßen

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit]
  Mit Zitat antworten Zitat
 


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 13:21 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