首页 > 解决方案 > 如何在 Delphi 中通过 IUPnPNAT 接口使用端口转发

问题描述

我想将端口转发到 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 的文档。

我想了解为什么这段代码不起作用。我得到的只是访问冲突错误消息。

只是一些额外的信息:

我的路由器确实支持 UPnP。我正在使用 Windows 7 和 Delphi 7。

标签: delphidelphi-7natupnp

解决方案


我建议使用 Id-Components,因为它们具有易于使用的转发功能。附件是 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;

推荐阅读