من اسکنر بسته را ساخته ام و اکنون می خواهم با استفاده از انگشت چاپ IP / TCP از طریق python-nmap دلخواه خود را به آن اضافه کنم. من بسته ای را با سوکت دریافت می کنم:
HOST = gethostbyname (gethostname ())
# یک سوکت خام ایجاد کنید و آن را به رابط عمومی متصل کنید
s = سوکت (AF_INET، SOCK_RAW، IPPROTO_IP)
s.bind ((HOST، 0))
data = s.recvfrom (65565)
برای آدرس آی پی منبع من استفاده می کنم:
unpackedData = struct.unpack ('! BBHHHBBH4s4s'، داده ها [:20])
sourceAddress = inet_ntoa (unpackedData [8])
برای شماره پورت منبع مورد استفاده من:
unpackedtcpData = struct.unpack ('! HHLLHH'، data [offset+1:offset+17])
source_port = str (unpackedtcpData [0])
من از کد زیر برای شناسایی از راه دور از یک بسته دریافت شده استفاده می کنم:
nm = nmap.PortScanner ()
nm.scan (sourceAddress.format ()، str (source_port))
اگر 'osclass' در nm [sourceAddress]:
برای osclass در nm [sourceAddress]['osclass']:
چاپ ('OsClass.type: {0}'. فرمت (osclass ['type']))
چاپ ('OsClass.vendor: {0}'. فرمت (osclass ['vendor']))
چاپ ('OsClass.osfamily: {0}'. فرمت (osclass ['osfamily']))
چاپ ('OsClass.osgen: {0}'. فرمت (osclass ['osgen']))
چاپ ('OsClass.accuracy: {0}'. فرمت (osclass ['accuracy']))
چاپ('')
اما این به من خطایی زیر میدهد:
KeyError: '192.168.23.
بر روی صفحه نمایش ضمیمه مشاهده کنید:

SourceAddress یک IP کاملا معتبر و قابل دسترسی است زیرا من آن را از هدر IP بسته دریافت کردم. به طور مشابه source_port نیز یک شماره پورت واقعی است که من از هدر TCP از همان بسته استخراج کردم. من این را ذکر کردم زیرا هر جا که من برای خطا جستجو می کنم، آنها می گویند دلیل این است که میزبان غیرقابل دسترسی است و یا افزودن میزبان معتبر نیست و در حال حاضر "UP" مانند این سؤال نیست:
https://stackoverflow.com/questions / 29133574 / what-does-keyerror-insert-ip-average
با این که از آنجا که آدرس IP و شماره پورت TCP را از یک بسته دریافت شده خارج کرده ام، میزبان باید بالا و قابل دسترس باشد. پس چرا کار نمی کند؟ من همچنین سعی کردم با استفاده از آدرس IP قابل دسترسی مانند '127.0.0.1'، اما هنوز آن را به من یک خطا به همین ترتیب است. مثل اینکه فقط آدرس IP را قبول نمی کند هر گونه کمک / پیشنهادات