![]() |
TClientSocket funktioniert nicht in einem Thread!?
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:
Mit freundlichen Grüßen
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; [edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit] |
Re: TClientSocket funktioniert nicht in einem Thread!?
Habe ein ähnliches Problem. Und zwar versuche ich in einer repeat Schleife innerhalb eines Threads mein ClietntSocket zu meinem Server verbinden zu lassen.
Die Verbindung kommt nie zu stande, obwohl der Server ordentlich läuft .. |
Re: TClientSocket funktioniert nicht in einem Thread!?
Du kannst doch nicht 'Destroy' in der Execute-Methode aufrufen. Das dürfte einige Probleme verursachen...
|
Re: TClientSocket funktioniert nicht in einem Thread!?
Nene DAS mache ich nicht :D Hab das Problem mittlerweile gelöst indem ich ClientType auf ctBlocking gesetzt habe. Jetzt wird allerdings das clientseitige OnRead Event nicht mehr ausgeführt :wall:
|
Re: TClientSocket funktioniert nicht in einem Thread!?
Zitat:
|
Re: TClientSocket funktioniert nicht in einem Thread!?
Zitat:
Ich bin jetzt aber auf direkte WinSock-Calls umgestiegen - was das Problem beseitigte. Aber trotzdem vielen Dank für die Antworten. :D Grüße |
Re: TClientSocket funktioniert nicht in einem Thread!?
Zitat:
|
Re: TClientSocket funktioniert nicht in einem Thread!?
Zitat:
Ich weiß nicht wieso ich Destroy() dort plaziert hatte, war wohl nur aus "Testzwecken". oO |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz