2015-04-11 4 views
0

Итак, я пытаюсь установить ретро-приложение, которое уже установлено, но для Linux. Основной jist - это код ниже работает для socket.IPPROTO_UDP, но не socket.IPPROTO_TCP.Python TCP Sniffer под Windows

import socket 





    #create an INET, STREAMing socket 

    HOST = socket.gethostbyname(socket.gethostname()) 
    # create a raw socket and bind it to the public interface 
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) 
    s.bind((HOST, 0)) 
    # Include IP headers 
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) 
    # receive all packages 
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) 

    # receive a packet 
    packet = s.recvfrom(65565) 
    print packet 

Я получаю ошибку при запуске выше: «строка 12, в s.bind ((HOST, 0)) Файл "", строка 1, в socket.error связывания: [Errno 10022] недопустимый аргумент был поставлен Если я суетиться вокруг с выше, и лишить ее, чтобы обнажить мин:.

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) 


# receive a packet 
packet = s.recvfrom(65565) 
print packet 

я получаю подобную ошибку, но чуть различий линии 7, в пакете = s.recvfrom (65565) socket.error : [Errno 10022] Был указан недопустимый аргумент

Сниффер, который я пытаюсь установить в ретро, ​​используя то же форматирование и c находится здесь: http://www.binarytides.com/python-packet-sniffer-code-linux/ - crd to dev - если кто-нибудь еще посоветует, я был бы признателен.

+0

65535 (2 ** 16) - 1 будет самым большим числом, которое вы могли бы использовать. а не 65565 – Gerrat

+0

Ничего не изменилось с tcp, а 65565 отлично работает для udp –

+0

А, я видел номер (это действительно странное число) и предположил, что он был просто опечатан. В документе [python docs] (https://docs.python.org/2/library/socket.html#socket.socket.recv) упоминается, что вы должны сделать это в 2 раза, но это не почему ваш код терпит неудачу. – Gerrat

ответ

1

Помимо вашей ошибки (пояснил Джеррат), вы не можете переносить этот код на Windows. Вы можете увидеть в этой статье, когда он говорит:

Linux because, although python is a portable, the programs wont run or give similar results on windows for example. This is due to difference in the implementation of the socket api.

Пакетные перехватчики в Windows, как правило, осуществляется зацепив Winsock API или используя драйвер WinPcap. Таким образом, вы идете неправильно.

Надеюсь, это поможет.

+0

Да. Свободно-программные снифферы * даже в UN \ * Xes, включая Linux *, обычно реализуются с использованием libpcap на UN \ * X и WinPcap в Windows и достаточно переносимы. У Python есть [pylibpcap] (http://sourceforge.net/projects/pylibpcap/) и [pcapy] (http://corelabs.coresecurity.com/index.php?module=Wiki&action=view&type=tool&name=Pcapy) обертки для libpcap/WinPcap. –

+0

Я переопределил код, который, как вы сказали, не работал, прямо в скрипт python windows без особых изменений для UDP, но не с TCP. Я все еще думаю, что это возможно с TCP, я просто не знаю, какие дополнительные функции вам нужно добавить, чтобы получить возможность IPPROTO.TCP. Исходный вопрос по-прежнему, почему IPPROTO.UDP отлично работает с окнами с пакетом = s.recvfrom (65565), но TCP терпит неудачу. Ofc посмотреть исходный почтовый индекс, чтобы увидеть разницу в попытках –

Смежные вопросы