UPnP端口映射,服务不接受连接

时间:2014-03-26 09:30:02

标签: objective-c cocoa sockets upnp

我设置了一个简单的套接字,它将接受端口1337上的连接。 它通过localhost接受连接:

$ nc -vv localhost 1337
found 0 associations
found 1 connections:
 1: flags=82<CONNECTED,PREFERRED>
outif lo0
src ::1 port 57224
dst ::1 port 1337
rank info not available
TCP aux info available

Connection to localhost port 1337 [tcp/menandmice-dns] succeeded!
^C

我使用Cocoa-PortMapper(https://github.com/mugginsoft/Cocoa-PortMapper)将此端口转发到我所支持的NAT路由器。

portMapper = [[PortMapper alloc] initWithPort:1337];

portMapper.desiredPublicPort = 1337;

[[NSNotificationCenter defaultCenter] addObserverForName:PortMapperChangedNotification object:portMapper queue:nil usingBlock:^(NSNotification *note) {
    NSLog(@"Successfully mapped: %@", portMapper.isMapped ? @"YES" : @"NO");
    NSLog(@"Mapped %@:%hu", portMapper.publicAddress, portMapper.publicPort);
}];

if(![portMapper waitTillOpened]) {
    NSLog(@"Could not open port");
}

它返回YES,在我的路由器UPnP Portmap表中,我可以看到外部端口1337上有一个活动的TCP映射,到我的计算机本地IP上的内部端口1337。

但是,通过外部IP连接到服务不起作用:

$ nc -vv xxx.89.136.xx 1337
nc: connectx to xxx.89.136.xx port 1337 (tcp) failed: Connection refused

如果我手动在路由器中设置端口转发规则,则连接有效。为什么即使我的路由器说它有效,UPnP端口映射也不起作用?

1 个答案:

答案 0 :(得分:1)

事实证明,端口映射在我的网络外部工作。当我从其他地方连接服务器时,而不是当我通过外部IP从本地计算机连接时。