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.