2015-11-11 6 views
0

Я пытаюсь отправить собственный пакет (с пользовательским слоем) с помощью Scapy в сокете python.Получение пользовательского пакета Scapy в сокете Python

Вот код клиента

#!/usr/bin/env python 

import socket 
from scapy.all import * 


TCP_PORT = 5000 
BUFFER_SIZE = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('192.168.240.1', TCP_PORT)) 


class Reservation(Packet): 
    name = "ReservationPacket" 
    fields_desc=[ ByteField("id", 0), 
     BitField("type",None, 0), 
     X3BytesField("update", 0), 
     ByteField("rssiap", 0)] 

k = IP(dst="192.168.240.1")/Reservation() 
k.show() 
send(k) 

print "Reservation Message Sent" 

s.close() 

и пакет к по-видимому, успешно создан и отправлен.

Вот сервер, который отвечает получить пакет:

#!/usr/bin/python 

import socket 
from scapy.all import * 


class Reservation(Packet): 
    name = "ReservationPacket" 
    fields_desc=[ ByteField("id", 0), 
     BitField("type",None, 0), 
     X3BytesField("update", 0), 
     ByteField("rssiap", 0)] 


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
s.bind(('192.168.240.1', 5000)) 
s.listen(1) 

while True : 

    conn, addr = s.accept() 

    print 'Connection address:', addr 

    print '' 

    data = conn.recv(1024) 
    data.show() 
    conn.close 

s.close() 

и это выход, я получаю от сервера:

Connection address: ('192.168.240.5', 58454) 

Traceback (most recent call last): 
File "server.py", line 36, in <module> 
    data.show() 
AttributeError: 'str' object has no attribute 'show' 

Как я могу получить мой пакет и декодировать его прочитать свой пользовательский слой?

ответ

0

данных стала строка в этой строке:

data = conn.recv(1024) 

Проверка док https://docs.python.org/2/library/socket.html

socket.recv(bufsize[, flags]) Receive data from the socket. The return value is a string representing the data received. The maximum amount of data to be received at once is specified by bufsize. See the Unix manual page recv(2) for the meaning of the optional argument flags; it defaults to zero.

Что вы пытаетесь сделать с data.show(), вы просто могли бы напечатать данные с :

print data 

Также по этой ссылке, чтобы декодировать строку: Python - converting sock.recv to string

stringdata = data.decode('utf-8') 
+0

data.show() должен отображать поля моего пакета. Если я попробую «распечатать данные», я ничего не получу. Я хотел бы также, чтобы получить доступ к полям моего пакета, как data.type, но он не работает: Traceback (самый последний вызов последнего): Файл « server.py», строка 36, в печати data.id AttributeError: объект 'str' не имеет атрибута 'id' – brid

+0

Вы не читали документацию, которую я наклеил там. Эти данные представляют собой строку, она не имеет идентификаторов или отображаемых атрибутов, если вы печатаете ее и ее None, это означает, что она пуста. – lapinkoira

+0

Спасибо, но я до сих пор не знаю, как это сделать, как я могу его получить, а затем использовать поля пакетов? – brid