做过 udp 穿 nat 的大神请进
发表于 : 2017-01-16 18:00
首先,我测试了本地的NAT,是端口严格的圆锥型。
我在服务器上运行一个 server,有终端连过来就记住,当终端数达到两个时,将每个终端的地址发给另一个终端。两个(nat后面的)终端收到对方的公网地址,同时相对发消息,我希望两个终端能互通。我在本地机器上运行两个终端,它们互相发的总是收不到。
服务器代码:
--------------------------------------------------------------------------
import socket
from time import sleep
s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
s.bind(( '0.0.0.0', 9876 ))
addrs = set()
while len( addrs ) < 2:
- data, addr = s.recvfrom( 1024 )
- addrs.add( addr )
print 'got 2 addrs.'
addrs = list( addrs )
s.sendto( repr( addrs ), addrs[1] )
s.sendto( repr( addrs ), addrs[0] )
print 'addrs sent.'
while True:
- sleep( 1 )
- print s.recvfrom( 1024 )
- s.sendto( 'from server', addrs[0] )
- s.sendto( 'from server', addrs[1] )
---------------------------------------------------------------------------
终端代码:
---------------------------------------------------------------------------
import socket
s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
s.sendto( 'are you ok?', ( '112.126.173.63', 9876 ))
AddrStr, _ = s.recvfrom( 1024 )
addrs = eval( AddrStr )
print 'got addrs', repr( addrs )
for i in range( 30 ):
- s.sendto( 'let us begin 0.', addrs[0] )
- s.sendto( 'let us begin 1.', addrs[1] )
- s.sendto( 'notice server.', ( '112.126.173.63‘, 9876 ) )
- s.settimeout( 0.3 )
- try:
-- print s.recvfrom( 1024 )
- except socket.timeout:
-- pass
---------------------------------------------------------------------------
运行时,两个终端都能收到双方的公网地址(我怕弄反了,所以两个都传),但后面分别向两个地址发的 s.sendto( 'let us begin 0.', addrs[0] ),对方收不到,自己也收不到。而与此同时,向服务器发的 s.sendto( 'notice server.', ( '112.126.173.63', 9876 ) ) 服务器就收到了。服务器向两个终端发的 s.sendto( 'from server', addrs[0] ) 终端也收得到。
从打印出来的数据看,两个终端的公网地址都是正确的,双方互相发,但彼此收不到。这是为什么?
我在服务器上运行一个 server,有终端连过来就记住,当终端数达到两个时,将每个终端的地址发给另一个终端。两个(nat后面的)终端收到对方的公网地址,同时相对发消息,我希望两个终端能互通。我在本地机器上运行两个终端,它们互相发的总是收不到。
服务器代码:
--------------------------------------------------------------------------
import socket
from time import sleep
s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
s.bind(( '0.0.0.0', 9876 ))
addrs = set()
while len( addrs ) < 2:
- data, addr = s.recvfrom( 1024 )
- addrs.add( addr )
print 'got 2 addrs.'
addrs = list( addrs )
s.sendto( repr( addrs ), addrs[1] )
s.sendto( repr( addrs ), addrs[0] )
print 'addrs sent.'
while True:
- sleep( 1 )
- print s.recvfrom( 1024 )
- s.sendto( 'from server', addrs[0] )
- s.sendto( 'from server', addrs[1] )
---------------------------------------------------------------------------
终端代码:
---------------------------------------------------------------------------
import socket
s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
s.sendto( 'are you ok?', ( '112.126.173.63', 9876 ))
AddrStr, _ = s.recvfrom( 1024 )
addrs = eval( AddrStr )
print 'got addrs', repr( addrs )
for i in range( 30 ):
- s.sendto( 'let us begin 0.', addrs[0] )
- s.sendto( 'let us begin 1.', addrs[1] )
- s.sendto( 'notice server.', ( '112.126.173.63‘, 9876 ) )
- s.settimeout( 0.3 )
- try:
-- print s.recvfrom( 1024 )
- except socket.timeout:
-- pass
---------------------------------------------------------------------------
运行时,两个终端都能收到双方的公网地址(我怕弄反了,所以两个都传),但后面分别向两个地址发的 s.sendto( 'let us begin 0.', addrs[0] ),对方收不到,自己也收不到。而与此同时,向服务器发的 s.sendto( 'notice server.', ( '112.126.173.63', 9876 ) ) 服务器就收到了。服务器向两个终端发的 s.sendto( 'from server', addrs[0] ) 终端也收得到。
从打印出来的数据看,两个终端的公网地址都是正确的,双方互相发,但彼此收不到。这是为什么?