Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Redirencionamento de Portas


Walisson

Question

Ola pessoal, estou com um problema insolúvel ate agora, passei horas na net procurando uma solução e nada espero que vocês possam me ajudar.

Eu tenho um programa servidor rodando no meu PC e quero acessa-lo pela internet mas para isso eu tenho que redirecionar a porta do meu modem para ele, manualmente eu conseguir o fazer mas quero saber como fazer via código Delphi. Jeito eu sei que tem pois no meu modem tem varias entradas de redirecionamento de programas que instalei(o CS por exemplo), que são adicionadas pelo próprio programa. Espero que vocês possam me trazer uma solução pois não aguento mas perder tempo procurando. Desde já Obrigado.

Link to comment
Share on other sites

20 answers to this question

Recommended Posts

  • 0

Valeu pela dica, mas ainda não é o que eu quero. Veja o Cenario:

Um programa cliente precisa se conectar ao programa servidor via internet.

Vamos dizer que o Servidor esta no Micro de IP: 192.168.1.3(Local) que tem acesso a internet por um Roteador de IP Real(200.184.34.76);

O Cliente conecta ao IP 200.184.34.76(Modem) pela porta 55 que tem que ser redirecionada para o IP: 192.168.1.3(Micro Servidor) onde esta o servidor escuntando na porta 55.

Como quero distribuir minha aplicação quero configurar o Redirecionamento do Modem via código Delphi. Pois seia chato e ate dificil pro usuario fazer manualmente.

Voce já jogo Counter Strike? Quando se instala ele e roda o servidor dele, o próprio servidor cria este redirecionamento no modem, que é via codigo.

Entendeu o que quero? Aguardo REspostA

Link to comment
Share on other sites

  • 0

voce pode tentar usar o componente TIdMappedPortTCP1 do pacote Indy

esta seria a forma mais simples de fazer um redirecionamento de porta

procedure TForm1.Button1Click(Sender: TObject);
begin
   IdMappedPortTCP1.MappedHost := '192.168.1.3';
   IdMappedPortTCP1.MappedPort := 55;
   IdMappedPortTCP1.Active := true;
end;
voce pode tentar usar assim tambem
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdMappedPortTCP,
  IdTCPConnection, IdTCPClient, StdCtrls;

type
  TForm1 = class(TForm)
    IdMappedPortTCP1: TIdMappedPortTCP;
    IdTCPClient1: TIdTCPClient;
    Button1: TButton;
    function GetHost(URL: string):string;
    function GetPort(URL: string):integer;
    function DelHostOfURL(URL,Host:string;Port:integer):string;
    procedure IdMappedPortTCP1Execute(AThread: TIdMappedPortThread);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses wininet, idUri;

{$R *.dfm}

function TForm1.GetHost(URL: string):string;
var
  LURI:TIdURI;
begin
  LURI:=TIdURI.Create(URL);
  result:=LURI.Host;
  LURI.Free;
end; //GetHost

function TForm1.GetPort(URL: string):integer;
var
  LURI:TIdURI;
begin
  LURI:=TIdURI.Create(URL);
  if Length(LURI.Port)<>0 then
  result:=StrToInt(LURI.Port)
  else
  result:=80;
  LURI.Free;
end; //GetPort

function TForm1.DelHostOfURL(URL,Host:string;Port:integer):string;
var
  s:string;
begin
  result:= URL;
  s:='http://'+Host;
  if Port <> 80 then
  s:= s + ':' + IntToStr(Port);
  Delete(result,pos(s,result),length(s));
end; //DelHostOfURL

procedure TForm1.IdMappedPortTCP1Execute(AThread: TIdMappedPortThread);
  var
  RequestHost:string;
  RequestPort:integer;
begin
  //IDLock.Acquire;
  try
  RequestHost:=GetHost(AThread.NetData);
  RequestPort:=GetPort(AThread.NetData);
     if (RequestHost<>IdMappedPortTcp1.MappedHost) or
     (RequestPort<>IdMappedPortTcp1.MappedPort) then
     begin
        IdMappedPortTCP1.MappedHost:=RequestHost;
        IdMappedPortTCP1.MappedPort:=RequestPort;
        TidTcpClient(AThread.OutboundClient).Host:=RequestHost;
        TidTcpClient(AThread.OutboundClient).Port:=RequestPort;
        TidTcpClient(AThread.OutboundClient).Disconnect;
        TidTcpClient(AThread.OutboundClient).Connect(AThread.ConnectTimeOut);
     end; //ChangeConnect
  finally
  //IDLock.Release;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   IdMappedPortTCP1.Active := true;
end;

abraço

Link to comment
Share on other sites

  • 0

Acho que isso não iria adianta. Não conheço este componente mas pelo o que eu entendir da rotina ele estará mapeando a porta 55 no endereço 192.168.1.3 que é o meu computador servidor e o problema esta é no modem. Mas esta rotina me deu uma deia.

Este componente consegue redirecionar uma conexão? Se possível poderíamos recriar a rotina acima do seguinte modo:

Algoritmo ->

Mapear o Host 192.168.1.1(Modem)

Porta 55

se receber um conexão

redirecione para 192.168.1.3(Servidor) porta 55

Será que seria possível?

Link to comment
Share on other sites

  • 0

que eu saiba voce pode criar varias instancias, ou seja, voce pode criar mais de um redirecionamento de porta

seria tipo

IdMappedPortTCP1.MappedHost := '192.168.1.1';
IdMappedPortTCP1.MappedPort := 55;
IdMappedPortTCP1.DefaultPort := 55;
IdMappedPortTCP1.Active := True;


IdMappedPortTCP2.MappedHost := '192.168.1.3';
IdMappedPortTCP2.MappedPort := 55;
IdMappedPortTCP2.DefaultPort := 55;
IdMappedPortTCP2.Active := True;

abraço

Link to comment
Share on other sites

  • 0

Jhonas muito obrigado pela ajuda ate agora :D , eu criei um projeto com o componente indy de você me indico,e eu conseguir fazer o redirecionamento das portas mas teve um problemas:

So funciona com o IP Real se o modem estiver configurado(NAT VIRTUAL SERVER), o que não é uma coisa boa pois estou querendo pular essa coonfiguração manual do modem;

Em rede local funciono, mas deu um problema de laço iinfinito onde o programa conecta o cliente ao servidor e em seguida é disconectado e volta a se conectar e ai vai.

Fiz upload dos projetos que estou utilizando para fazer os teste se pude dar um olha seria otimo!

http://www.4shared.com/rar/gdZkJTRO/Delphi...ndo_Portas.html?

Link to comment
Share on other sites

  • 0
Em rede local funciono, mas deu um problema de laço iinfinito onde o programa conecta o cliente ao servidor e em seguida é disconectado e volta a se conectar e ai vai.

não testei o componente, somente te informei porque está em ingles, qual o uso desse componente, que diz que ele serve para redirecionar as portas ....

o que voce relata, acho que tem haver com o Thread, parece que cada instancia deve estar rodando em uma Thread

por isso mencionei o codigo do button2 do link

procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
Thread: TIdMappedPortThread;
begin
with IdMappedPortTCP1.Threads.LockList do
try
for I := 0 to Count-1 do
begin
Thread := TIdMappedPortThread(Items[I]);
Thread.Connection.Disconnect;
Thread.OutboundClient.Disconnect;
end;
finally
IdMappedPortTCP1.Threads.UnlockList;
end;

se tivesse um help para ler, eu poderia ajuda-lo de uma melhor forma

OBS: vou dar uma olhada no seu projeto, mas sem compromisso ... ok ? pois estou trabalhando em um projeto para melhorar a resposta ( velocidade ) de um servidor de dados.

abraço

Link to comment
Share on other sites

  • 0

Aqui esta o trecho do projeto que fazer tudo funcionar:

procedure TForm2.IdMappedPortTCP1Connect(AContext: TIdContext);

begin

AddEvento('Cliente Conectado >'+AContext.Connection.Socket.Host);

With AContext.Connection.Socket do

begin

Close;

Host := EdRedHost.Text;

Port := StrToInt(EdRedPort.Text);

Open;

end;

end;

Este evento aconte quando um cliente se conectado no servidor mapeado na porta mapeada. Então assim que o cliente se conecta eu fecho a conexão, altero o Host e a porta para a do meu servidor e abro a conexão novamente . Mas o cliente e conectado e em seguida desconectado e o programa se conecta ao servidor num laço infinito.

Link to comment
Share on other sites

  • 0
Não deu certo, não sei se isso funciona no windows 7, mas eu percebi que quando eu executo o ping no IP Real o modem não responde, mas quando uso o IP Local do modem(192.168.1.1) ele responde, será que tem algo a ver!

veja que para o windows 7 é dessa forma

http://www.colorconsole.de/cmd/en/Windows_7/netsh.htm

amigo, voce vai ter que fazer tentativa e erro para descobrir como funciona

abraço

Link to comment
Share on other sites

  • 0
veja se voce colocou a porta como exceção do firewall

Esta liberada sim, eu consigo acessar o servidor via internet mas eu o configurei manualmente. É então o jeito vai ser eu recriar o projeto usando conexão reversa. Assim apenas o pc servidor deverá ser configurado. Mas vai dar muito trabalho fazer tudo de novo. :(

Edited by Walisson
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...