parameters: (self,destaddr,destport)
docstring: __negotiatesocks4(self,destaddr,destport)
          Negotiates a connection through a SOCKS4 server.
docstring_summary: __negotiatesocks4(self,destaddr,destport)
          Negotiates a connection through a SOCKS4 server.
docstring_tokens: __negotiatesocks4 ( self destaddr destport ) Negotiates a connection through a SOCKS4 server .
function: 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)
function_tokens: 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 )