为什么在Python中使用套接字接收重复的数据帧?
我写了一个简单的客户端/服务器代码,用来通过套接字发送和接收数据帧,但在接收时,我收到了重复的数据包,像这样:
> num seq= 4751 num seq= 4751 num seq= 4752 num seq= 4752 num seq= 4753
> num seq= 4753 num seq= 4754 num seq= 4754 num seq= 4755 num seq= 4755
> num seq= 4756 num seq= 4756 num seq= 4757 num seq= 4757 num seq= 4758
> num seq= 4758 num seq= 4759 num seq= 4759 num seq= 4760 num seq= 4760
> num seq= 4761 num seq= 4761 num seq= 4762 num seq= 4762 num seq= 4763
> num seq= 4763 num seq= 4764 num seq= 4764 num seq= 4765 num seq= 4765
> num seq= 4766 num seq= 4766 num seq= 4767 num seq= 4767 num seq= 4768
> num seq= 4768 num seq= 4769 num seq= 4769 num seq= 4770 num seq= 4770
> num seq= 4771 num seq= 4771 num seq= 4772 num seq= 4772 num seq= 4773
> num seq= 4773 num seq= 4774 num seq= 4774 num seq= 4775 num seq= 4775
> num seq= 4776 num seq= 4776 num seq= 4777 num seq= 4777 num seq= 4778
我搞不懂为什么接收到的数据包会重复!!?
这是客户端的代码:
from socket import *
import binascii
#creation of the RAW socket
s=socket(AF_PACKET, SOCK_RAW)
# bind the socket to the interface
s.bind(("eth0",0))
# Ethernet header
src="\x01\x01\x01\x01\x01\x01"
dst="\x02\x02\x02\x02\x02\x02"
ethertype="74" #type or length
# generate an infinite traffic
i=0 # frame number
while True :
payload=("0"*(100-len(str(i))))+str(i)
cr=binascii.crc32(dst+src+ethertype+payload)
res=''
for j in range(4): # calculate the crc
t=cr & 0xFF
cr >>= 8
res='%02X%s' % (t, res)
s.send(dst+src+ethertype+payload+res) # send the frame
i+=1
而服务器的代码是:
from scapy.all import *
def traiter(p) :
k=str(p) #transform the frame to a string
print "num seq=",int(k[14:112]) # print the sequence number
def main():
# intercept packet and send it to traiter
sniff(iface="lo", prn=lambda x: traiter(x))
if __name__ == "__main__":
sys.exit(main())
1 个回答
0
这是一种正常的情况:如果源和目标在同一台机器上,当你在回环接口上监听时,你会捕捉到进出的数据包!所以这些数据包并不是重复的。