delphi - 如何在 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。
解决方案
我建议使用 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;
推荐阅读
- java - Avro Schema 字段名称:如何包含“非法”字符
- powerbi - 只有当某些用户访问主表时,是否可以在明细表中实现RLS?
- java - 如何在 Spring Boot 中使用带有休息模板的多部分表单数据
- javascript - 如何在不设置几个函数 onclick 的情况下替换多个 div?
- c# - 如何设置用户角色而不会被登录的新用户覆盖?
- java - 计算日期范围并返回 true
- javascript - 如何在 react-modal 中设置组件?
- java - 为什么它无法读取bmp文件。?
- java - if else 选择 login.activity 或 register.activity 有问题
- pandas - 将 kdb 表保存到数据框,然后将数据框保存到 csv。错误地输出到 csv 的 null 和字符串值?