我需要在几天内完成一个项目,它是一个基本的客户端和服务器接口。问题是它必须是所有原始套接字。我创建它没有问题,我只是坚持发送数据包。
首先,我尝试将其绑定到接口“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
*这个 (the 0101
) 是有效载荷的开始,即使它应该是数据包的开始。另外我不会使用任何其他模块,我必须使用套接字。