title: socket.error[Errno 99] Cannot assign requested address
body: <p>Yesterday, I created a python script called <code>sniffer_ip_header_decode.py</code>, but I had the following error:</p>
  
  <pre><code>Traceback (most recent call last):
    File "sniffer_ip_header_decode.py", line 51, in &lt;module&gt;
      sniffer.bind((host, 0))
    File "/usr/lib/python2.7/socket.py", line 228, in meth
      return getattr(self._sock,name)(*args)
  socket.error: [Errno 99] Cannot assign requested address
  </code></pre>
  
  <p>Here is the code:</p>
  
  <pre><code>import socket
  import os
  import struct
  from ctypes import *
  
  #host to listen on
  host = "192.168.0.187"
  
  #our IP header
  class IP(Structure): 
      fields = [
         ("ihl",            c_ubyte, 4),
         ("version",        c_ubyte, 4),
         ("tos",            c_ubyte),
         ("len",            c_ushort),
         ("id",             c_ushort),
         ("offset",         c_ushort),
         ("ttl",            c_ubyte),
         ("protocol_sum",   c_ubyte),
         ("sum",            c_ushort),
         ("src",            c_ulong),
         ("dst",            c_ulong),
      ]
  
      def __new__(self, socket_buffer=None): 
          return self.from_buffer_copy(socket_buffer)
  
      def __init__(self, socket_buffer=None):  
  
          #map protocol constants to theyr names
          self.protocol_map = {1:"ICMP", 6:"TCP", 17:"UDP"}
  
          #Human readable IP addresses
          self.src_address = socket.inet_ntoa(struct.pack("&lt;L",self.src))
          self.dst_address = socket.inet_ntoa(struct.pack("&lt;L",self.dst))
  
          #Human readable protocol
          try: 
              self.protocol = self.protocol_map[seld.protocol_num]
          except: 
              self.protocol = str(self.protocol_num)
  
  #This should look familiar from the previous example
  if os.name == "nt": 
      socket_protocol = socket.IPPROTO_IP
  else: 
      socket_protocol = socket.IPPROTO_ICMP
  
  sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)
  
  sniffer.bind((host, 0))
  sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
  
  if os.name == "nt": 
      sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
  
  try: 
  
      while True: 
          #read in a packet
          raw_buffer = sniffer.recvfrom(65565)[0]
  
          #create an IP header from the first 20 bytes of the buffer
          ip_header = IP(raw_buffer[0:20])
  
          #print out the protocol that was detected and the host
          print "Protocol: %s %s -&gt; %s" % (ip_header.protocol, ip_header.src_address, ip_header.dst_address)
  #Handle CTRL - C
  except KeyboardInterrupt: 
  
      #if we're using windows. turn off promiscuous mode
      if os.name == "nt": 
          sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)   
  </code></pre>