Как использовать переадресацию портов с интерфейсом IUPnPNAT в Delphi - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу перенести порт на открытое соединение с сервером в Delphi (я использую TServerSocket).

Я использую эту процедуру, которую я нашел в другом вопросе StackOverflow:

procedure AddUPnPEntry(Port: Integer; const Name: ShortString; LAN_IP: string);
var
  Nat: Variant;
  Ports: Variant;
begin
  if not (LAN_IP = '127.0.0.1') then
    begin
      Nat   := CreateOleObject('HNetCfg.NATUPnP');
      Ports := Nat.StaticPortMappingCollection;
      if not VarIsClear(Ports) then
        begin
          CoInitialize(nil);
          try
            ShowMessage(IntToStr(Ports.count));
            Ports.Add(Port,'TCP',Port,LAN_IP,True,name);
          finally
            CoUninitialize;
          end;
        end;
    end;
end;

Я уже пробовал читать документацию MSDN , используя разные фрагменты кода (аналогично этому).

Я хочу понять, почему этот код не работает. Все, что я получаю, это сообщение об ошибке Access Violation.

Просто дополнительная информация:

Мой маршрутизатор поддерживает UPnP. Я использую Windows 7 и Delphi 7.

1 Ответ

0 голосов
/ 03 апреля 2019

Я рекомендую использовать Id-компоненты, поскольку они имеют простые в использовании функции пересылки.В приложении приведен пример пересылки TCP и UDP.Вам нужно будет указать сервер для переадресации, а также порт на вашей машине и порт, на который вы хотите переадресовать его на сервер.

uses
IdMappedPortUDP, IdMappedPortTCP;


tcpForwader: TIdMappedPortTCP;     
udpForwader: TIdMappedPortUDP;

tcpForwader             := TIdMappedPortTCP.Create(nil);
tcpForwader.MappedHost  := <ServerToForwardTo>;
tcpForwader.MappedPort  := <PortOnServer>;
tcpForwader.DefaultPort := <LocalPort>;
tcpForwader.Active      := True;

udpForwader                := TIdMappedPortUDP.Create(nil);
udpForwader.MappedHost     := <ServerToForwardTo>;
udpForwader.MappedPort     := <PortOnServer>;
udpForwader.DefaultPort    := <LocalPort>;
udpForwader.Active         := True;
...