Einzelnen Beitrag anzeigen

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