2017-04-17 94 views
1

昨天,我創建了一個名爲sniffer_ip_header_decode.py Python腳本,但我有以下錯誤:socket.error [錯誤99]無法分配請求的地址

Traceback (most recent call last): 
    File "sniffer_ip_header_decode.py", line 51, in <module> 
    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 

下面是代碼:

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("<L",self.src)) 
     self.dst_address = socket.inet_ntoa(struct.pack("<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 -> %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) 

回答

0

此行是錯誤的:

host = "192.168.0.187" 

變量「主機」必須是有效的IP,您可以使用您的IP。

相關問題