Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Redirencionamento de Portas


Walisson

Pergunta

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 para o comentário
Compartilhar em outros sites

20 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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. :(

Editado por Walisson
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...