Здесь является моим; это записано на проблемно-ориентированном языке, который я изобрел, названный 'палиндромом'.
p
Редактирование: Меньше легкомысленной версии (i386 asm, AT& T синтаксис)
xor %eax, %eax
mov %esi, %edi
#cld not necessary, assume DF=0 as per x86 ABI
repne scasb
scan:
dec %edi
cmpsb
.byte 0x75, 6 #jnz (short) done
dec %edi
cmp %esi, %edi
.byte 0x72, -9 #jb (short) scan
inc %eax
done:
16 байтов, указатель строки входит в ESI, результат находится в EAX.
Является ли это старым кодом, который, как вы упомянули, находил? Мне это кажется разумным, но я сам не тестировал (или много использовал сырые сокеты). Этот пример из документации показывает, как использовать сырые сокеты для прослушивания пакетов, и он выглядит достаточно похоже.
Системные вызовы сокетов (или Winsocks в Windows) уже заключены в стандартный модуль socket
: intro , ссылка ].
Я никогда не использовал сырые сокеты, но похоже, что их можно использовать с этим модулем:
В последнем примере показано, как написать очень простой сетевой сниффер с raw сокеты в Windows. Пример требует прав администратора для изменить интерфейс:
импортный сокет # публичный сетевой интерфейс ХОСТ = socket.gethostbyname (socket.gethostname ()) # создать сырой сокет и привязать его к общедоступному интерфейсу s = socket.socket (socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) s.bind ((ХОЗЯИН, 0)) # Включить заголовки IP s.setsockopt (socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # получить все пакеты s.ioctl (сокет.SIO_RCVALL, socket.RCVALL_ON) # получить посылку напечатать s.recvfrom (65565) # отключен беспорядочный режим s.ioctl (сокет.SIO_RCVALL, socket.RCVALL_OFF)
Класс сокета должен помочь. В противном случае вам нужно написать модуль Python на C или просто использовать C. См. http://mail.python.org/pipermail/python-list/2001-April/077454.html .
Базовый поиск в Google обнаружил это.
Я действительно пробовал пример кода, на который указал "раскрутка". AF_PACKET работал у меня в python 2.7.4
В конце концов, лучшим решением для этого случая было написать все на C, потому что это небольшое приложение, поэтому написать такую мелочь на более чем 1.
После долгих экспериментов с сокетами C и python RAW я в конце концов предпочел сокеты C RAW. Сокеты RAW требуют модификации на уровне битов менее 8-ми битных групп для записи заголовков пакетов. Иногда пишут всего 4 бита или меньше. python не определяет для этого никакой помощи, тогда как Linux C имеет для этого полный API.
Но я определенно верю, что если бы только эта небольшая инициализация заголовка была удобно обработана в python, я бы никогда не использовал здесь C.
]