在 Python 套接字中接收自定义 Scapy 数据包

Receiving custom Scapy packet in a Python socket

我正在尝试在 python 套接字中使用 Scapy 发送自定义数据包(带有自定义层)。

这是客户端的代码

#!/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()

数据包 k 似乎已成功创建并发送。

这是负责接收数据包的服务器:

#!/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'

如何接收我的数据包并将其解码以读取其自定义层?

数据在这一行变成了一个字符串:

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

也按照这个 link 来解码字符串: Python - converting sock.recv to string

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