这是一个计网的实验。需要捕获本机的IP包。
但是一直在报错,就是在补货的时候会说我的端口被占用。
import socket
print(socket.IPPROTO_TCP)
def catchIPData():
# 获取本机IP作为公共网络接口
HOST = socket.gethostbyname(socket.gethostname())
# 创建一个原始套接字
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
# 将该套接字与公共网络接口绑定
s.bind((HOST,0))
# 设定该套接字包含IP数据报首部
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# 设定该套接字接收所有数据包
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# 接收一个数据包并返回
packet = s.recvfrom(4096)
return packet
def decodeIpHeader(packet):
# 创建一个空字典
IPDatagram = {}
# 根据RFC791协议对数据包进行解析
IPDatagram['version'] = packet[0] >> 4
IPDatagram['headLength'] = packet[0] & 0x0f
IPDatagram['serviceType'] = packet[1]
IPDatagram['totalLength'] = (packet[2] << 8) + packet[3]
IPDatagram['identification'] = (packet[4] << 8) + packet[5]
IPDatagram['flag'] = packet[6] >> 5
IPDatagram['moreFragment'] = IPDatagram['flag'] & 1
IPDatagram['dontFragment'] = (IPDatagram['flag'] >> 1) & 1
IPDatagram['fragmentOffset'] = ((packet[6] & 0x1f) << 8) + packet[7]
IPDatagram['TTL'] = packet[8]
IPDatagram['protocol'] = packet[9]
IPDatagram['headerCheckSum'] = (packet[10] << 8) + packet[11]
# 源IP地址和目的IP地址都按照IP地址的格式用字符串存储
IPDatagram['sourceAddress'] = "%d.%d.%d.%d" % (packet[12], packet[13], packet[14], packet[15])
IPDatagram['destinationAddress'] = "%d.%d.%d.%d" % (packet[16], packet[17], packet[18], packet[19])
# 根据数据包中头部长度确定是否有选项,如果有则添加至option列表中
IPDatagram['options'] = []
if IPDatagram['headLength'] > 5:
step = 5
while step < IPDatagram['headLength']:
IPDatagram['options'].append(packet[step * 4])
IPDatagram['options'].append(packet[step * 4 + 1])
IPDatagram['options'].append(packet[step * 4 + 2])
IPDatagram['options'].append(packet[step * 4 + 3])
step += 1
# 根据数据包中的总长度将数据部分添加至data列表中
IPDatagram['data'] = []
step = IPDatagram['headLength'] * 4
while step < IPDatagram['totalLength']:
IPDatagram['data'].append(packet[step])
step += 1
# 返回储存有数据包数据的字典
return IPDatagram
mm=catchIPData()
print(decodeIpHeader(mm))
D:\pycharm\test\Scripts\python.exe "C:\Users\helen yin\PycharmProjects\pythonProject\main.py"
6
Traceback (most recent call last):
File "C:\Users\helen yin\PycharmProjects\pythonProject\main.py", line 54, in
mm=catchIPData()
File "C:\Users\helen yin\PycharmProjects\pythonProject\main.py", line 7, in catchIPData
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
File "C:\Users\helen yin\AppData\Local\Programs\Python\Python38\lib\socket.py", line 231, in init
_socket.socket.init(self, family, type, proto, fileno)
OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
进程已结束,退出代码1
我尝试去查询了这个错误发生的原因,但是当我尝试杀死进程的时候我发现首先我不知道我现在正在运行的是哪个进程,其次
我查询了某个进程准备杀死他的时候
他杀不死
希望可以得到解答
ChatGPT尝试为您解答,仅供参考
当您试图捕获本机的 IP 包时遇到端口被占用的错误,可能是因为其他进程正在使用该端口。在您的代码中,您正在将套接字绑定到公共网络接口的 0 号端口(即系统分配的任意端口)。因此,在您运行代码时,可能会发现这个端口已被占用。
为了避免这个问题,您可以尝试使用更高的端口,例如 1024 或更高。这些端口通常被视为“用户端口”,可供应用程序使用,而不是系统使用。您可以在调用 bind 方法时将端口参数替换为所需的端口号:
s.bind((HOST, 1024))
此外,您还可以尝试使用 getsockname 方法检查套接字绑定的实际端口号,以确保您已成功绑定到所需端口:
print(s.getsockname()[1])
import fcntl
import socket, struct
ifname="eth0"
soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
IP = socket.inet_ntoa(fcntl.ioctl(soc.fileno(), 0x8915, struct.pack('256s', bytes(ifname[:15], 'utf-8')))[20:24])
print(IP)
是不是因为端口被其他进程占用呀,通过netstat -nalt,看一下端口占用情况,然后通过kill释放进程和端口,重新试一下
python调用scapy抓包 ,什么包都给你捕获了