Autor Beitrag
override
Hält's aus hier
Beiträge: 1



BeitragVerfasst: So 18.03.07 17:16 
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.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
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 > 0then 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

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von override am So 18.03.07 19:14, insgesamt 2-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 19.03.07 00:08 
Moin und :welcome: im Forum!

:hair: Ähm, dein Code ist - sagen wir mal - "interessant"... :? (und vor allem benutzt du den TClientSocket nicht blocking, was du scheinbar glaubst... :?!?:)

Darf ich dir mal das hier ans Herz legen, wenn du da ereignisorientiert drangehen willst? ;)

Ansonsten rate ich zum IdTCPServer/Client von den Indies, falls du lieber blocking und mit Threads arbeiten willst. :mahn:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.