Python原始套接字接收问题

3
我正在使用以下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()

接收端是否出现任何错误?print语句的输出是什么? - BrandonM
接收消息的服务器应该始终处于活动状态,但似乎您关闭了套接字。 - Menglong Li
我没有从“print response”中得到任何输出,Brandon。它一直在等待recv函数。即使它已经从客户端接收到了数据。 - Balaji subramanian
我尝试过不关闭套接字,但它无法捕获传入的数据包。 - Balaji subramanian
2个回答

6
socket函数有第三个参数:protocol,如果不指定,默认为0。对于AF_PACKET / SOCK_RAWprotocol参数指定你想要接收的数据包类型。这些值在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))
...

对你的代码有一些其他的意见:

按照目前的写法,发送的数据包很可能无法被任何人理解。你给出了目标和源MAC地址,但没有提供EtherType。相反,第一个"[("将被视为EtherType。这可能对数据包的接收者毫无意义,因此它将被丢弃。

此外,你应该明白,使用原始套接字,你将接收到指定协议类型的下一个数据包。那不一定是(实际上很可能不是)对你刚发送的数据包的响应。


我检查了Linux man页面链接,那里没有协议声明...在if_ether.h文件中找到它们解决了问题...太棒了! - repzero

1
感谢大家,现在我能够使用以下脚本接收数据包。但是在循环中打印多个响应数据包时仍然存在问题。
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

请您能否使用更好的变量名,比如说明a代表什么,b代表什么。 - Meric Ozcan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接