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]