当使用sr()或srp()函数时-Scapy如何知道收到的数据包是我发送的数据包的应答?在
我写了一个模仿BACNet的自定义协议。我可以向BACNet设备发送WHO'u IS数据包,设备用I\u AM数据包进行应答,由于层绑定,该数据包被正确分解,但sr函数不将其识别为应答。我怎么接受这些答案?在
更新:
这就是我的图层类的样子。我认为answers()
方法看起来不错,但仍然不起作用。在实现answers()
方法时,我是否有什么误解?
在我的理解中,self
指的是层本身的类,other
是所讨论的接收包。因此,为了将有效负载传递到下一个更高的层,我传递other.payload
并使用下一个更高层的类调用answers()
方法。
这些层堆叠成Ether/IP/UDP/BVLC/NPDU/APDU
。在
class BVLC(Packet):
name = "BVLC"
fields_desc = [
# many fields
]
def post_build(self, pkt, pay):
if self.length == None:
pkt = pkt[0:2] + struct.pack('!H', len(pay)+len(pkt)) + pkt[4:]
return pkt+pay
def answers(self, other):
if not isinstance(other,BVLC):
return 0
else:
return NPDU.answers(other.payload)
class NPDU(Packet):
name = "NPDU"
fields_desc = [
# again, many fields
]
def answers(self, other):
if not isinstance(other,NPDU):
return 0
else:
return APDU.answers(other.payload)
class APDU(Packet):
name = "APDU"
fields_desc = [
# many fields and the only relevant field in this case
ConditionalField(
ByteEnumField(
"serviceChoice", None, APDU_Service_Unconfirmed.revDict()),
lambda pkt: pkt.pduType == APDU_Type.CONFIRMED_SERVICE_REQUEST or
pkt.pduType == APDU_Type.UNCONFIRMED_SERVICE_REQUEST),
]
def answers(self, other):
if not isinstance(other,APDU):
return 0
else:
if self.serviceChoice == APDU_Service_Unconfirmed.WHO_IS and\
other.serviceChoice == APDU_Service_Unconfirmed.I_AM:
return 1
return 0
Scapy
sr
只对发送的每个包调用recv_packet.answers(sent_packet)
。 因此,您必须为您的层实现def answers()
,请参见:以下是原始
^{pr2}$TCP
层的摘录:相关问题 更多 >
编程相关推荐