| 194 | return (family, sockaddr) |
| 195 | |
| 196 | def try_send(self): |
| 197 | if self.tries >= 3: |
| 198 | return |
| 199 | self.tries += 1 |
| 200 | |
| 201 | if self.to_nameserver is None: |
| 202 | _, peer = get_random_nameserver() |
| 203 | port = 53 |
| 204 | else: |
| 205 | peer = self.to_ns_peer |
| 206 | port = int(self.to_ns_port) |
| 207 | |
| 208 | family, sockaddr = self._addrinfo(peer, port) |
| 209 | sock = socket.socket(family, socket.SOCK_DGRAM) |
| 210 | sock.connect(sockaddr) |
| 211 | |
| 212 | self.peers[sock] = peer |
| 213 | |
| 214 | debug2('DNS: sending to %r:%d (try %d)' % (peer, port, self.tries)) |
| 215 | try: |
| 216 | sock.send(self.request) |
| 217 | self.socks.append(sock) |
| 218 | except socket.error: |
| 219 | _, e = sys.exc_info()[:2] |
| 220 | if e.args[0] in ssnet.NET_ERRS: |
| 221 | # might have been spurious; try again. |
| 222 | # Note: these errors sometimes are reported by recv(), |
| 223 | # and sometimes by send(). We have to catch both. |
| 224 | debug2('DNS send to %r: %s' % (peer, e)) |
| 225 | self.try_send() |
| 226 | return |
| 227 | else: |
| 228 | log('DNS send to %r: %s' % (peer, e)) |
| 229 | return |
| 230 | |
| 231 | def callback(self, sock): |
| 232 | peer = self.peers[sock] |