Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ClientSocket/ServerSocket und Hamachi (https://www.delphipraxis.net/131305-clientsocket-serversocket-und-hamachi.html)

Socke_SG 22. Mär 2009 20:53


ClientSocket/ServerSocket und Hamachi
 
Hallo zusammen,

habe ein Programm geschrieben, welches übers Netzwerk letztendlich nur Stirngs austauscht. Klappt im Netzwerk auch wunderbar, doch wenn ich das ganze versuche über Hamachi (um es übers Internet zu benutzen) ans laufen zu kriegen gibt es Probleme. Client und Server finden und verbinden sich wunderbar miteinander, doch sobald irgendwie eine Nachricht gesendet wird (die im übrigen meistens ein Befehl ist, der intern verarbeitet wird), gibt es eine Zugriffsverletzung der Adresse 00000000 usw. Die Befehle haben in der Regel vier Zeichen als Befehlskennung, die dann vom Client/Server erkannt und weiterverarbeitet weden, sprich, z.B. dass eine Zahlenfolge in ein Array geschrieben wird.

Versteht ihr zufällig woran das liegen könnte? Meine Vermutung ist, dass die Befehle evtl nicht komplett übertragen werden. Vielleicht fällt euch ja etwas dazu ein.

Vielen Dank im Voraus

PS: Hier ein Beispiel wie das bei mir aussieht:

Delphi-Quellcode:
procedure TFrmServer.ServerSocketClientRead (Sender: TObject; Socket: TCustomWinSocket);
var Nachricht: TChatNachricht;
    I: Integer;
    l,j,k: integer;
    dummy: string;
    randomnumber: integer;
    blub: string;
    testzeug: string;
    packetsize: integer;
begin

  {Nachricht empfangen}
  Socket.ReceiveBuf (Nachricht, SizeOf(Nachricht));
  edit1.text:=nachricht.text;
  mess:= edit1.Text;

   if mess[1]+mess[2]+mess[3]+mess[4]+mess[5]+mess[6]+mess[7]='#$§#GCX' then begin
    mess[1]:=' ';
    mess[2]:=' ';
    mess[3]:=' ';
    mess[4]:=' ';
    mess[5]:=' ';
    mess[6]:=' ';
    mess[7]:=' ';
    mess:=trim(mess);
    zahl:=StrToInt(mess);
  end;

alleinherrscher 23. Mär 2009 00:54

Re: ClientSocket/ServerSocket und Hamachi
 
Ich weiß zwar nicht genau, woran es liegt. Aber du könntest mal das Programm "Wippien" Link testen. Finde ich eig. noch besser als Hamachi, da es ein SDK und eine Mini VPN Applikation gibt. Eigene VPN tunnel kann man damit leider nicht kompilieren, weil die Freeware auf kostenpflichte Komponenten (wodVPN) zurückgreift.

Gruß, Michael

sx2008 23. Mär 2009 07:28

Re: ClientSocket/ServerSocket und Hamachi
 
Zitat:

Zitat von Socke_SG
Meine Vermutung ist, dass die Befehle evtl nicht komplett übertragen werden.

Richtig, die Daten können in unvorhersagbarer Weise zerstückelt werden.
Die Datenhäppchen kommen aber gottseidank ich richtiger Reihenfolge; dafür sorgt das Betriebssystem.

Daher muss der Empfang der Daten immer so aussehen:
Delphi-Quellcode:
// dieser Sourcecode ist so vielleicht nicht direkt compilierbar
// er soll nur das Prinzip zeigen
procedure TForm1.DataReceivedHandler(Sender:TObject);
var
  command : string;
  p : integer;
begin
  // empfangene Daten anhängen
  FReceiverBuffer := FReceiverBuffer + socket.ReceiveText;
  // Annahme: alle Befehle enden mit CR/LF
  p := Pos(#13#10, FReceivebuffer);
  if p <> 0 then
  begin
    // Befehl rauskopieren
    command := Copy(FReceiveBuffer, 1, p-1);
    // und aus dem Empfangspuffer entfernen
    FReceiveBuffer := Copy(FReceiveBuffer, p+1, 99999);
    ParseAndExcuteCommand(command);
  end;
end;

Socke_SG 23. Mär 2009 21:03

Re: ClientSocket/ServerSocket und Hamachi
 
Ah super.
Ist die Prozedur ReceiveHandler Standart oder muss ich die selber definieren? Ebenso FReceiveBuffer... Da weiss ich nicht ganz wie ich das definieren soll. Wäre super wenn du mir da noch was zu sagen könntest.

ParseandExecute kenne ich auch nicht :-( sorry für meine Unwissenheit...

Achja und wofür steht das #13#10.....? Und was meinst du mit "Alle Befehle enden mit CR/LF"???

Socke_SG 24. Mär 2009 13:42

Re: ClientSocket/ServerSocket und Hamachi
 
Hmm, also ich habe mir einfach mal die ankommenden Nachrichten ausgeben lassen. Die sind normal vorhanden, auch nicht abgehakt oder so. Dennoch zeigt er mir einen Zugriffsfehler bei der Adresse 0000000 an. Könnte das evtl noch nen anderen Grund haben?

Nur so als Hinweis, ich habe einen Router! Allerdings wird die Verbindung ganz normal hergestellt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 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