AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Client - Server über Internet
Thema durchsuchen
Ansicht
Themen-Optionen

Client - Server über Internet

Ein Thema von Cordt · begonnen am 28. Jul 2013 · letzter Beitrag vom 29. Jul 2013
Antwort Antwort
Cordt

Registriert seit: 10. Jan 2013
32 Beiträge
 
#1

Client - Server über Internet

  Alt 28. Jul 2013, 22:57
Hi Leute,

ich versuche schon seit einer ganzen weile und einiges an Google und DP-suchaufwand ein kleines client-serversystem aufzubaun.

Ich habe mich mit diversen tutors rumgeschlagen, jedoch habe ich nur bei den standard-komponenten [TClientSocket;TServerSocket] "erfolg" gehabt.
Indy und 3.anbieterkomponenten konnte ich nichteinmal im LAN zu einer verbindung bringen.

der folgende Quelltext kommt zu einer Verbindung, wenn ich die Lokale Server-IP übergebe. Nicht aber wenn ich die Router-IP, sprich meine Internet-IP übergebe. das habe ich auch ausserhalb dieses netzwerks getestet.
Intern bekomm ich eine Zeitüberschreitung (Socketfehlercode 10060) extern weist mein system offensichtlich den versuch zurück (10061).

Windowsfirewall hat entsprechende Ports freigegeben(ein und ausgehend, auf beiden hier getesteten systemen) und wurde zusätzlich deaktiviert.
Richtige Firewalls wurden deaktiviert.
Router hat ne Portweiterleitung auf entsprechendem Port auf die lokale IP meines "servers"
IP und Port sind festgelegt und mehrfach geprüft.
Andere Ports wurden getestet.

Könnt Ihr mir sagen woran ich scheitere?


Server
Delphi-Quellcode:
{Komponenten: ein Button, ein Memo}

procedure TMainForm.Button1Click(Sender: TObject);
begin
  FServerSocket.Active:= not FServerSocket.Active;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FServerSocket:= TServerSocket.Create(Self);
  FServerSocket.OnClientRead:= ServerOnClientRead;
  FServerSocket.OnClientWrite:= ServerOnClientWrite;
  FServerSocket.OnClientError:= ServerOnClientError;
  FServerSocket.OnClientConnect:= ServerOnClientConnect;
  FServerSocket.OnClientDisconnect:= ServerOnClientDisconnect;
  FServerSocket.Port:= 8521;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  FServerSocket.Free;
end;

procedure TMainForm.ServerOnClientRead(Sender: TObject; Server: TCustomWinSocket);
var
  pBuf : PAnsiChar;
  nLen : Integer;
  szReceivedtext: String;
begin
  {$IFDEF UNICODE}
  nLen:= Server.ReceiveLength;
  if nLen <= 0 then
     Exit;
  pBuf:= AnsiStrAlloc(nLen);
  try
    nLen:= Server.ReceiveBuf(pBuf^, nLen);
    SetString(szReceivedtext, pBuf, nLen);
  finally
    StrDispose(pBuf);
  end;

  {$ELSE}
  szReceivedText:= Server.ReceiveText;
  {$ENDIF UNICODE}

  Memo1.Lines.Add(szReceivedText);
end;

procedure TMainForm.ServerOnClientConnect(Sender: TObject; Server: TCustomWinSocket);
begin
  Memo1.Lines.Add('Client ('+Server.RemoteAddress+') connected.');
  Server.SendText('Welcome to Server '+Server.LocalHost);
end;

procedure TMainForm.ServerOnClientDisconnect(Sender: TObject; Server: TCustomWinSocket);
begin
  Memo1.Lines.Add('Client ('+Server.RemoteHost+') disconnected.');
end;

end.

Client
Delphi-Quellcode:
{Komponenten: ein Button, ein Memo}

procedure TMainForm.Button1Click(Sender: TObject);
begin
  FClientSocket.Active:= not FClientSocket.Active;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FClientSocket:= TClientSocket.Create(Self);
  FClientSocket.Port:= 8521;
  FClientSocket.Address:= {hier steht die Internet-IP meines Routers}
  FClientSocket.OnLookup:= ClientOnLookup;
  FClientSocket.OnConnecting:= ClientOnConnecting;
  FClientSocket.OnConnect:= ClientOnConnect;
  FClientSocket.OnDisconnect:= ClientOnDisconnect;
  FClientSocket.OnRead:= ClientOnRead;
  FClientSocket.OnWrite:= ClientOnWrite;
  FClientSocket.OnError:= ClientOnError;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  FClientSocket.Free;
end;

procedure TMainForm.ClientOnRead(Sender: TObject; Server: TCustomWinSocket);
var
  pBuf : PAnsiChar;
  nLen : Integer;
  szReceivedtext: String;
begin
  {$IFDEF UNICODE}
  nLen:= Server.ReceiveLength;
  if nLen <= 0 then
     Exit;
  pBuf:= AnsiStrAlloc(nLen);
  try
    nLen:= Server.ReceiveBuf(pBuf^, nLen);
    SetString(szReceivedtext, pBuf, nLen);
  finally
    StrDispose(pBuf);
  end;
  {$ELSE}
  szReceivedText:= Server.ReceiveText;
  {$ENDIF UNICODE}

  Memo1.Lines.Add(szReceivedText);

end;


procedure TMainForm.ClientOnConnect(Sender: TObject; Server: TCustomWinSocket);
begin
  Server.SendText('Hello from '+ Server.LocalAddress);
end;

procedure TMainForm.ClientOnDisconnect(Sender: TObject; Server: TCustomWinSocket);
begin
  Server.SendText('Bye');
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Client - Server über Internet

  Alt 29. Jul 2013, 04:50
Du solltest die Portweiterleitung per NAT mit einem anderen Server testen.
Zum Beispiel Apache Webserver installieren und dann im Router den Port 80 weiterleiten.
Danach testen ob der Webserver über die Internetadresse des Routers erreichbar ist.

Falls ja weisst du jetzt, dass die Portweiterleitung funktioniert.
Falls es nicht funktioniert weisst du wo das Problem liegt.

Versuche nicht diesen Test abzukürzen indem du gleich deinen eigenen Server verwendest!
Dazu ein Beispiel:
Dein Auto bekommt ein repariertes Steuergerät und ausserdem gebrauchte Zündspulen weil die alten Zündspulen defekt waren.
Trotzdem springt der Motor nicht an und man sieht auch keine Zündfunken.
Entweder ist das Zündsteuergerät defekt und/oder die Zündspulen und/oder die Teile wurden falsch eingebaut.
Aber wo ist der Fehler?
Man findet den Fehler wenn man Teile verwendet, die garantiert funktionieren und immer nur ein Teil ins Spiel bringt das man testen möchte.
Dazu gehört aber auch nicht nur die Teile zu testen sondern auch die eigenen Fähigkeiten zu testen.
Genauso wie man Motorteile falsch einbauen kann, kann man auch Fehler bei der Portweiterleitung machen.
Also verwendet man zum Test einen Server der garantiert funktioniert (z.B. Apache Webserver) und prüft erstmal ob die eigene Vorstellung wie die Portweiterleitung funktionieren soll richtig ist.
fork me on Github
  Mit Zitat antworten Zitat
Cordt

Registriert seit: 10. Jan 2013
32 Beiträge
 
#3

AW: Client - Server über Internet

  Alt 29. Jul 2013, 17:27
Hey sx2008,

danke für deine Antwort. Ich benutz für einen anderen Server(minecraft) aus alter zeit bereits eine portweiterleitung auf einen anderen Port nach selbigem Prinzip.
Nach den Gesetzen der Logik sollte die Weiterleitung an sich also funktionieren.
Ich werd mir deinen Vorschlag dennoch morgen mal vornehmen und das auch nochmal so testen, damit da eine 100%ige sicherheit vorliegt.

Wenn ich die Ergebnisse habe push ich sie hier rein.
Danke und Lg Cordt
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Client - Server über Internet

  Alt 29. Jul 2013, 18:21
Gut. Zusätzlich solltest du bei dem Delphi-Server darauf achten, dass die Listen IP-Adresse = 0.0.0.0 ist.
Ein Server kann auf verschiedenen IP-Adressen lauschen:
* 127.0.0.1 = Loopback-Interface. Server kann nur Verbindungen vom lokalen Rechner annehmen
* lokale IP einer Netzwerkkarte. Ein Rechner kann mehrere Netzwerkadapter haben und pro Adapter kann es mehr als eine IP geben. In der Regel ist aber nur ein Adapter mit einer IP (z.B. 192.168.0.14) vorhanden.
Lauscht der Server auf dieser IP, dann nimmt er nur über diese IP externe Verbindungen an.
In diesem Fall kann der Server über "lokalhost" nicht erreicht werden
* 0.0.0.0 der Server lauscht auf allen vorhandenen IP-Adressen

Die Listen IP-Adresse wird über die Properties LocalHost bzw. LocalAddress eingestellt.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Client - Server über Internet

  Alt 29. Jul 2013, 19:50
Ganz wichtig ist, wenn du es mit deinem Router testen möchtest, dass du niemals von innen anfragst. Das funktioniert bei den meisten Routern nicht. Sprich es muss jemand anderes von außen testen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz