(self,destaddr,destport)
__negotiatesocks4(self,destaddr,destport)
        Negotiates a connection through a SOCKS4 server.
__negotiatesocks4(self,destaddr,destport)
        Negotiates a connection through a SOCKS4 server.
__negotiatesocks4 ( self destaddr destport ) Negotiates a connection through a SOCKS4 server .
def __negotiatesocks4(self,destaddr,destport):
        """__negotiatesocks4(self,destaddr,destport)
        Negotiates a connection through a SOCKS4 server.
        """
        # Check if the destination address provided is an IP address
        rmtrslv = False
        try:
            ipaddr = socket.inet_aton(destaddr)
        except socket.error:
            # It's a DNS name. Check where it should be resolved.
            if self.__proxy[3]:
                ipaddr = struct.pack("BBBB", 0x00, 0x00, 0x00, 0x01)
                rmtrslv = True
            else:
                ipaddr = socket.inet_aton(socket.gethostbyname(destaddr))
        # Construct the request packet
        req = struct.pack(">BBH", 0x04, 0x01, destport) + ipaddr
        # The username parameter is considered userid for SOCKS4
        if self.__proxy[4] != None:
            req = req + self.__proxy[4]
        req = req + chr(0x00).encode()
        # DNS name if remote resolving is required
        # NOTE: This is actually an extension to the SOCKS4 protocol
        # called SOCKS4A and may not be supported in all cases.
        if rmtrslv:
            req = req + destaddr + chr(0x00).encode()
        self.sendall(req)
        # Get the response from the server
        resp = self.__recvall(8)
        if resp[0:1] != chr(0x00).encode():
            # Bad data
            self.close()
            raise GeneralProxyError((1,_generalerrors[1]))
        if resp[1:2] != chr(0x5A).encode():
            # Server returned an error
            self.close()
            if ord(resp[1:2]) in (91, 92, 93):
                self.close()
                raise Socks4Error((ord(resp[1:2]), _socks4errors[ord(resp[1:2]) - 90]))
            else:
                raise Socks4Error((94, _socks4errors[4]))
        # Get the bound address/port
        self.__proxysockname = (socket.inet_ntoa(resp[4:]), struct.unpack(">H", resp[2:4])[0])
        if rmtrslv != None:
            self.__proxypeername = (socket.inet_ntoa(ipaddr), destport)
        else:
            self.__proxypeername = (destaddr, destport)
def __negotiatesocks4 ( self , destaddr , destport ) : # Check if the destination address provided is an IP address rmtrslv = False try : ipaddr = socket . inet_aton ( destaddr ) except socket . error : # It's a DNS name. Check where it should be resolved. if self . __proxy [ 3 ] : ipaddr = struct . pack ( "BBBB" , 0x00 , 0x00 , 0x00 , 0x01 ) rmtrslv = True else : ipaddr = socket . inet_aton ( socket . gethostbyname ( destaddr ) ) # Construct the request packet req = struct . pack ( ">BBH" , 0x04 , 0x01 , destport ) + ipaddr # The username parameter is considered userid for SOCKS4 if self . __proxy [ 4 ] != None : req = req + self . __proxy [ 4 ] req = req + chr ( 0x00 ) . encode ( ) # DNS name if remote resolving is required # NOTE: This is actually an extension to the SOCKS4 protocol # called SOCKS4A and may not be supported in all cases. if rmtrslv : req = req + destaddr + chr ( 0x00 ) . encode ( ) self . sendall ( req ) # Get the response from the server resp = self . __recvall ( 8 ) if resp [ 0 : 1 ] != chr ( 0x00 ) . encode ( ) : # Bad data self . close ( ) raise GeneralProxyError ( ( 1 , _generalerrors [ 1 ] ) ) if resp [ 1 : 2 ] != chr ( 0x5A ) . encode ( ) : # Server returned an error self . close ( ) if ord ( resp [ 1 : 2 ] ) in ( 91 , 92 , 93 ) : self . close ( ) raise Socks4Error ( ( ord ( resp [ 1 : 2 ] ) , _socks4errors [ ord ( resp [ 1 : 2 ] ) - 90 ] ) ) else : raise Socks4Error ( ( 94 , _socks4errors [ 4 ] ) ) # Get the bound address/port self . __proxysockname = ( socket . inet_ntoa ( resp [ 4 : ] ) , struct . unpack ( ">H" , resp [ 2 : 4 ] ) [ 0 ] ) if rmtrslv != None : self . __proxypeername = ( socket . inet_ntoa ( ipaddr ) , destport ) else : self . __proxypeername = ( destaddr , destport )