Мне как-то удалось заставить это работать. Несколько слов об этом:
Мне удалось заставить его работать, и ACK для отправки. Не совсем уверен, в чем была проблема, и, возможно, это было больше, чем одна проблема (часть из них в части отправки подтверждения).
Это мой рабочий код для справки-
while not self.event.is_set():
try:
recv_pkt = self.l2_socket.recv()
except pcapdnet.PcapTimeoutElapsed:
print "except"
continue
if recv_pkt is not None and recv_pkt.haslayer(TCP) and \
(recv_pkt[TCP].sport == self.tcp_spoofed_conn.tcp_connection.dst_port and
recv_pkt[TCP].dport == self.tcp_spoofed_conn.tcp_connection.src_port and
recv_pkt[IP].src == self.tcp_spoofed_conn.tcp_connection.dst_ip and
recv_pkt[IP].dst == self.tcp_spoofed_conn.tcp_connection.src_ip and
recv_pkt[Dot1Q].vlan == self.tcp_spoofed_conn.tcp_connection.vlan and
recv_pkt[Ether].src == self.tcp_spoofed_conn.tcp_connection.dst_mac.lower() and
recv_pkt[Ether].dst == self.tcp_spoofed_conn.tcp_connection.src_mac.lower()):
# send ack
- Важно - исключение все еще возникает во многих итерациях цикла, но код приема пакета достигается в других итерациях цикла. Значение - пакеты принимаются и получают ACK, и это исключение следует игнорировать
- Источник исключения имеет отношение к Winpcap, используемому scapy для чтения пакетов. Это код
_L2pcapdnetSocket.recv_raw()
из scapy\pcapdnet.py
while pkt is None:
pkt = self.ins.next()
if pkt is not None:
ts, pkt = pkt
if pkt is None and scapy.consts.WINDOWS:
raise PcapTimeoutElapsed # To understand this behavior, have a look at L2pcapListenSocket's note # noqa: E501
и это примечание, на которое оно ссылается-
# Note: Timeout with Winpcap/Npcap
# The 4th argument of open_pcap corresponds to timeout. In an ideal world, we would # noqa: E501
# set it to 0 ==> blocking pcap_next_ex.
# However, the way it is handled is very poor, and result in a jerky packet stream. # noqa: E501
# To fix this, we set 100 and the implementation under windows is slightly different, as # noqa: E501
# everything is always received as non-blocking
self.ins = open_pcap(iface, MTU, self.promisc, 100, monitor=monitor) # noqa: E501
Так что я думаю, что нет реального способа избежать этого исключения, и единственный обходной путь - except
it и continue
.