如何在python中发送原始以太网帧?

如何在python中发送原始以太网帧?,python,sockets,ethernet,Python,Sockets,Ethernet,我需要有一个项目在几天内完成,它是一个基本的客户端和服务器接口。问题是它需要所有原始套接字。我没有问题,创建,我只是停留在发送数据包 首先,我尝试将它绑定到接口“en1”,但它不断给我一个错误nodename not known。当我将它绑定到本地ip地址时,它工作正常。完成这项工作后,我创建了一个原始数据包类,它都是十六进制的。然后我打了一个叫sendto的电话通过电话发送 问题是,当我使用wireshark捕获数据包时,它显示为ipv4数据包的有效负载。我不希望它自动生成标题,这就是我的原始

我需要有一个项目在几天内完成,它是一个基本的客户端和服务器接口。问题是它需要所有原始套接字。我没有问题,创建,我只是停留在发送数据包

首先,我尝试将它绑定到接口“en1”,但它不断给我一个错误
nodename not known
。当我将它绑定到本地ip地址时,它工作正常。完成这项工作后,我创建了一个原始数据包类,它都是十六进制的。然后我打了一个叫sendto的电话通过电话发送

问题是,当我使用wireshark捕获数据包时,它显示为ipv4数据包的有效负载。我不希望它自动生成标题,这就是我的原始数据包类的用途。你知道我有什么办法可以去掉这些标题吗

以下是我的代码-仅原始函数:

def raw():
    HOST = gethostbyname('192.168.1.10')

    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
    s.bind((HOST, 0))

    s.setsockopt(IPPROTO_IP, IP_HDRINCL, 0) #no headers - it wont work!!

    pckt = packet("\x68\x65\x6c\x6c\x6f")
    netpacket = pckt.getpacket()

    print "Sending.. "
    print ""

    s.sendto(netpacket, ('192.168.1.1', 80))
    data = s.recv(4096)
    print data
这是捕获的数据包,末尾有一个hello:

007f 2809 6da2 28cf daee 2156 0800 4500 004d 1bfc 0000 4000 db59 c0a8 010a c0a8 0101* 007f     

2809 6da2 28cf daee 2156 0800 4500 0036 2352 4000 4006 0000 c0a8 010a c0a8 0101 15c0 0050 

0000 0000 0000 0000 8010 813b 0000 68656c6c6f -hello

*这(0101)是有效负载的开始,即使它应该是数据包的开始。另外,我不打算使用任何其他模块,我必须使用socket。

由于对这个问题的评论,我成功地与服务器建立了连接。在linux中,只需将地址族更改为af_数据包。然后我将它绑定到我的nic并发送。成功了。谢谢大家的帮助! 下面是一些示例代码:

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("en1", 0))
pckt = packet() #my class that initializes the raw hex
data = pckt.getpacket()
s.send(data)
message = s.recv(4096)
print s
print s.decode('hex')

它需要在linux或debian中。据我所知,它在MacOSX中不起作用。idk关于windows。如果你有一台mac电脑,使用pycap或scapy,它们工作正常。

在回答你的问题时,Andrew,举个例子:

这个答案帮助我让WoL工作起来。在这种情况下,数据为:

preamble = bytearray((0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF))
MAC = bytearray((0x00, 0x14, 0x85, 0xa4, 0x73, 0xce))
data = PREAMBLE + 16*MAC

有趣的问题,我真的帮不上忙,但也许这个问题是相关的:耐心是一种美德。请记住,您的问题越容易阅读,就越有可能有人能够快速理解您的问题的本质并提出有用的解决方案(提示:正确的大写字母和段落分隔符非常有用)其他示例使用AF_数据包而不是AF_INET,如果您正在运行Linux,您可能希望尝试它,因为它看起来是Linux专用的。谢谢大家,我还没有在Linux上试过,但我想我可以。如果它能在linux上运行,我会给你回复的。我有一个带有Windows7、xp和debian的MacOSX btw。我现在就添加linux。。。o和我都很抱歉没有耐心。@NoahKoster:如果你真的想发送一个原始的以太网帧,就像你在标题中说的那样,为什么你要使用绑定到IP地址的AF_INET套接字?您不应该使用绑定到接口的AF_数据包吗?谢谢分享!你能给出一个发送字符串的例子吗?现在还不清楚你的“packet”类抽象了多少“magic”。我无法在这里发布代码,所以请参阅下面的一段对我有用的数据片段。