1 from time import strftime
2 from traceback import print_exc
8 def coordinateHolePunching(peer1, peer2, holePunchingAddr):
11 print >> sys.stderr, "NatTraversal: coordinateHolePunching at", holePunchingAddr
15 udpsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
16 udpsock.bind(holePunchingAddr)
17 udpsock.settimeout(60)
19 except socket.error, (errno, strerror) :
25 print >> sys.stderr, "NatTraversal: Could not open socket: %s" % (strerror)
30 print >> sys.stderr, "NatTraversal: waiting for connection..."
37 data, peeraddr1 = udpsock.recvfrom(1024)
42 print >> sys.stderr, "NatTraversal:", strftime("%Y/%m/%d %H:%M:%S"), "...connected from: ", peeraddr1
45 elif peeraddr2 != peeraddr1:
46 udpsock.sendto(peeraddr1[0] + ":" + str(peeraddr1[1]), peeraddr2)
47 udpsock.sendto(peeraddr1[0] + ":" + str(peeraddr1[1]), peeraddr2)
48 udpsock.sendto(peeraddr1[0] + ":" + str(peeraddr1[1]), peeraddr2)
49 udpsock.sendto(peeraddr2[0] + ":" + str(peeraddr2[1]), peeraddr1)
50 udpsock.sendto(peeraddr2[0] + ":" + str(peeraddr2[1]), peeraddr1)
51 udpsock.sendto(peeraddr2[0] + ":" + str(peeraddr2[1]), peeraddr1)
54 except socket.timeout, error:
56 print >> sys.stderr, "NatTraversal: timeout with peers", error
63 def tryConnect(coordinator):
66 udpsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
70 udpsock.sendto("ping",coordinator)
71 udpsock.sendto("ping",coordinator)
72 udpsock.sendto("ping",coordinator)
74 print >> sys.stderr, "NatTraversal: sending ping to ", coordinator
76 # Wait for response from the coordinator
82 data, addr = udpsock.recvfrom(1024)
83 except socket.timeout, (strerror):
85 print >> sys.stderr, "NatTraversal: timeout with coordinator"
88 if addr == coordinator:
90 print >> sys.stderr, "NatTraversal: received", data, "from coordinator"
94 print >> sys.stderr, "NatTraversal: received", data, "from", addr
98 # host, port = data.split(":")
101 # print >> sys.stderr, "NatCheckMsgHandler: error in received data:", data
103 # peer = (host, int(port))
105 # udpsock.sendto("hello",peer)
106 # udpsock.sendto("hello",peer)
107 # udpsock.sendto("hello",peer)
110 # data, addr = udpsock.recvfrom(1024)
112 # except socket.timeout, (strerror):
114 # print >> sys.stderr, "NatTraversal: first timeout", strerror
115 # print >> sys.stderr, "NatTraversal: resend"
122 host, port = data.split(":")
125 print >> sys.stderr, "NatCheckMsgHandler: error in received data:", data
128 peer = (host, int(port))
129 udpsock.sendto("hello",peer)
130 udpsock.sendto("hello",peer)
131 udpsock.sendto("hello",peer)
139 data, addr = udpsock.recvfrom(1024)
140 except socket.timeout, (strerror):
142 print >> sys.stderr, "NatTraversal: first timeout", strerror
143 print >> sys.stderr, "NatTraversal: resend"
145 udpsock.sendto("hello", peer)
146 udpsock.sendto("hello", peer)
147 udpsock.sendto("hello", peer)
150 data, addr = udpsock.recvfrom(1024)
151 except socket.timeout, (strerror):
153 print >> sys.stderr, "NatTraversal: second timeout", strerror
157 # data received, check address
158 if addr == peer: # peer is not symmetric NAT
161 if addr[0] == peer[0]: # peer has a symmetric NAT
166 udpsock.sendto("hello",peer)
167 udpsock.sendto("hello",peer)
168 udpsock.sendto("hello",peer)
174 print >> sys.stderr, "NatTraversal: message from", addr, "is", data