Einzelnen Beitrag anzeigen

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