如何使用scapy接收一个数据包的两个答案



我正在使用scapy在Python中开发类似于TCP Server的东西。典型的TCP服务器应该是这样工作的。

  • 首先,它通过调用sniff来等待传入的SYN数据包
  • 其次,它在单个调用中发送SYNACK并等待ACK响应,这是通过sr1调用完成的
  • 第三,它通过调用sniff来等待带有客户端请求的传入数据包

但问题是请求数据包可能在sr1和第二个sniff之间到达,因此会丢失,因为sniff不会捕获在调用之前到达的数据包。(我可以通过Wireshark看到一个包裹即将到达(。

如何在一次调用中发送SYNACK并同时接收ACK和请求,"原子地"?

(在典型的TCP连接中,客户端会在超时后重新发送带有请求的数据包,但根据我的任务条件,没有重新发送数据包,数据包不会丢失(。

您可以创建一个scapy套接字并在其上调用sr1sniff

from scapy.config import conf
sock = conf.L3socket()
sock.sr1(....)
sock.sniff(...)

因为它是同一个套接字,所以您不会丢失任何数据包

最新更新