在绑定到网络后,无法通过python中的套接字发送任何原始数据

2024-06-03 03:54:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过我的系统的“eth1”接口发送一个原始的十六进制数据包。我写了下面的内容,当我执行它时没有看到任何错误。在

#! /usr/bin/python
import socket

class packet:
     hexstr=""

     def getpacket(self,hexs):
            packet.hexstr=hexs
            return packet.hexstr

# create a socket object
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.IPPROTO_IP)

# get local machine name

port = 9999

# bind to the port
s.bind(('eth1', port))

#s.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)

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

msg_send = s.send(data)
#msg_recv = s.recv(4096)
print msg_send
#print msg_recv

但是,当我在9999端口和接口上使用“tcpdump”并运行上述操作时,我没有看到任何数据包被捕获。在

^{pr2}$

我做错什么了?在


Tags: ipsendpacketbindportmsgsocket数据包
1条回答
网友
1楼 · 发布于 2024-06-03 03:54:19

终于成功了。以下是我实际代码中的一些重要代码片段:

#! /usr/bin/python
# some imports
import socket, sys
from struct import *

#create a raw socket
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
except socket.error , msg:
    print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()

# tell kernel not to put in headers, since we are providing it, when using IPPROTO_RAW this is not necessary
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

 packet = '';
 source_ip = '192.168.1.101'# Your IP
 dest_ip = '10.10.29.34' #Your IP or socket.gethostbyname('www.google.com')

#Create your own IP, TCP headers and User Data 
## Some hints for those who are really trying it and are new to socket programming like me, make use of the struct, pack() and unpack() in python. 
packet = ip_header + tcp_header + user_data
s.sendto(packet, (dest_ip , 0 ))

相关问题 更多 >