Python原始套接字接收问题

Python原始套接字接收问题

问题描述:

我正在使用以下python脚本来处理原始套接字数据包传输。数据包传输很好,但我无法从另一端打印传入数据包。Python原始套接字接收问题

from socket import socket, AF_PACKET, SOCK_RAW 

s = socket(AF_PACKET, SOCK_RAW) 
s.bind(("eth0", 0)) 
src_addr = "\x54\xbe\xf7\x40\xf5\x82" 
dst_addr = "\xff\xff\xff\xff\xff\xff" 

payload = ("[("*30)+"Hello"+("]"*30) 
checksum = "\x1a\x2b\x3c\x4d" 

data = payload+checksum 

s.send(dst_addr+src_addr+data) 

#for receive function 

response=s.recv(4096) 
print response 
s.close() 
+0

接收端给出任何错误?打印声明的输出是什么? – BrandonM

+0

接收消息的服务器应始终处于活动状态,但似乎已关闭套接字。 –

+0

不,我从“打印回应”布兰登得到任何印刷品。它继续等待recv fn。即使它从客户端收到。 –

有一个第三个参数socket功能:。如果没有给出,则默认为0.对于AF_PACKET/SOCK_RAW,参数指定您有兴趣接收哪种数据包。这些值记录在packet(7)手册页中:http://man7.org/linux/man-pages/man7/packet.7.html

我不认为这些值实际上是在核心python2模块中的任何位置定义的。其中一些可以在scapy中找到(http://www.secdev.org/projects/scapy/),或者您可以在其中定义它们的linux头文件(/usr/include/linux/if_ether.h)。

因此,要解决这个问题,你的代码更改为:

from socket import socket, AF_PACKET, SOCK_RAW, htons 

ETH_P_ALL = 3 
ETH_P_IP = 0x800 # Alternatively using this will receive the next IP packet 
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 
... 

您的代码的其他意见:

书面,你要发送的数据包是不可能被任何人是可以理解的。你有一个dst和src MAC地址,但是你没有提供EtherType。相反,第一个“[(”将被视为以太网类型,这对于任何数据包的接收器来说都没有意义,所以它将被丢弃。

另外,您应该了解,使用原始套接字将会收到你在协议中指定的类型的下一个数据包,这不一定(对于刚刚发送的数据包可能不会)(对其实际上可能不会)对

感谢所有人我可以用下面的脚本来接收数据包,但是我仍然面临着打印多个响应数据包的问题(在循环中)

from socket import socket, AF_PACKET, SOCK_RAW, htons 
from struct import * 
import select 
import time 

ETH_P_ALL = 3 
ETH_P_IP = 0x800 
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 
s.bind(("eth0", 0)) 

src_addr = "\x54\xbe\xf7\x40\xf7\x82" 
dst_addr = "\xff\xff\xff\xff\xff\xff" 
l = "\x00\x21" 

ethertype = "\x08\x01" 

a ="\x00\x10\x00\x10\x00\x10" 
b = "\x00\x11\x00\x11\x00\x11" 

payload = ethertype + l + a + b 

for i in range(5): 

    time.sleep(5) 
    s.send(dst_addr+src_addr+ payload) 
    message=s.recv(4096) 
    print message