Changeset 8248

Show
Ignore:
Timestamp:
06/09/07 09:07:05 (18 months ago)
Author:
asterix
Message:

[Santiago Gala] IPv6 filetransfert. see #1969

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/common/socks5.py

    r7441 r8248  
    349349                if host is not None: 
    350350                        try: 
    351                                 self.host = socket.gethostbyname(host) 
     351                                self.host = host 
     352                                self.ais = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) 
    352353                        except socket.gaierror: 
    353                                 self.host = None 
     354                                self.ais = None 
    354355                self.idlequeue = idlequeue 
    355356                self.fd = -1 
     
    794795                ''' 
    795796                self.port = port 
     797                self.ais = socket.getaddrinfo(None, port, socket.AF_UNSPEC, 
     798                                        socket.SOCK_STREAM, socket.SOL_TCP, socket.AI_PASSIVE) 
    796799                self.queue_idx = -1      
    797800                self.idlequeue = idlequeue 
     
    802805                 
    803806        def bind(self): 
    804                 self._serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    805                 self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    806                 self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 
    807                 self._serv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 
    808                 # will fail when port as busy, or we don't have rights to bind 
    809                 try: 
    810                         self._serv.bind(('0.0.0.0', self.port)) 
    811                 except Exception, e: 
     807                for ai in self.ais: 
     808                        #try the different possibilities (ipv6, ipv4, etc.) 
     809                        self._serv = socket.socket(*ai[:3]) 
     810                        self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     811                        self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 
     812                        self._serv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 
     813                        # will fail when port as busy, or we don't have rights to bind 
     814                        try: 
     815                                self._serv.bind(ai[4]) 
     816                                self.ai = ai 
     817                                break 
     818                        except: 
     819                                self.ai = None 
     820                                continue 
     821                if not self.ai: 
    812822                        # unable to bind, show error dialog 
    813823                        return None 
     
    885895        def connect(self): 
    886896                ''' create the socket and plug it to the idlequeue ''' 
    887                 self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    888                 # this will not block the GUI 
    889                 self._sock.setblocking(False) 
     897                for ai in self.ais: 
     898                        try: 
     899                                self._sock=socket.socket(*ai[:3]) 
     900                                # this will not block the GUI 
     901                                self._sock.setblocking(False) 
     902                                self._server=ai[4] 
     903                                break 
     904                        except: 
     905                                if sys.exc_value[0] == errno.EINPROGRESS: 
     906                                        break 
     907                                #for all errors, we try other addresses 
     908                                continue 
    890909                self.fd = self._sock.fileno() 
    891910                self.state = 0 # about to be connected 
     
    951970        def do_connect(self): 
    952971                try: 
    953                         self._sock.connect((self.host, self.port)) 
     972                        self._sock.connect(self._server) 
    954973                        self._sock.setblocking(False) 
    955974                        self._send=self._sock.send