python中socket修改ttl_用Python编写TTL装饰器

我正在尝试在python中编写TTL装饰器.

基本上我给它引发一个异常,如果函数不

在选定的时间回答.

from thread2 import Thread

""" A TTL decorator. """

class Worker(Thread):

def __init__(self, q, f, args, kvargs):

Thread.__init__(self)

self.q = q

self.f = f

self.args = args

self.kvargs = kvargs

def run(self,):

try:

res = (True, self.f(*self.args, **self.kvargs))

self.q.put(res)

except Exception, e:

self.q.put((False, e))

class Referee(Thread):

def __init__(self,q, ttl,exception_factory):

Thread.__init__(self)

self.exception_factory=exception_factory

self.q=q

self.ttl=ttl

def run(self):

time.sleep(self.ttl)

res = (False, self.exception_factory())

self.q.put(res)

def raise_if_too_long(ttl, exception_factory=lambda :RuntimeError("Timeout")):

def raise_if_too_long_aux(f):

def ritl(*args,**kvargs):

q = Queue.Queue(2)

referee = Referee(q, ttl, exception_factory)

worker = Worker(q,f,args,kvargs)

worker.start()

referee.start()

(valid, res)= q.get(1)

q.task_done()

referee.terminate()

worker.terminate()

if valid:

return res

else:

raise res

return ritl

return raise_if_too_long_aux

但是,我得到了一些非常糟糕的结果.

似乎有时函数还可以返回

在达到TTL且出现错误之前,装饰器不会返回

加薪.

您在此代码中看到错误吗?

是否有在Python中使用TTL编写函数的通用方法/库?

Python构建一个完整的IP数据报文通常涉及到使用socket库,该库提供了网络编程的功能。以下是一个简化的步骤说明: 1. 导入socket模块: ```python import socket ``` 2. 创建套接字对象,指定网络类型和协议类型(通常是IPv4和TCP): ```python ip_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) ``` 注意这里我们使用`SOCK_RAW`标志,使得套接字可以发送原始IP数据包。 3. 定义源和目标IP地址以及端口: ```python src_ip = '192.168.1.1' dst_ip = '192.168.1.2' src_port = 0 # 如果不确定,可以选择随机端口 ``` 4. 构建IP头部结构,包括版本、头长、服务类型、总长度、标识符、偏移量、生存时间、TTL(跳数)、协议类型(如TCP或UDP)、头部校验和、源IP和目标IP: ```python ip_header = b'\x45\x00' # IPv4 Version 4 (1 byte) | Don't Fragment (DF bit set to 0) (1 byte) ip_header += b'\x00\x00' # Total Length (2 bytes) ip_header += b'\x00\x14' # Identification (2 bytes) ip_header += b'\x40\x00' # Flags and Fragment Offset (3 bytes) ip_header += b'\xFF\xFE' # Time-to-Live (8 bits) | Protocol (8 bits) ip_header += b'\x00\x00\x00\x00' # Header Checksum (16 bytes, will be filled later) ip_header += src_ip + dst_ip # Source and Destination IP addresses ``` 5. 如果需要,填充TCP/UDP头部(根据选择的协议): - 对于TCP:创建TCP头部,包含源/目的端口号、序列号、确认号、头部选项等。 - 对于UDP:只需设置源/目的端口号即可。 6. 将应用层数据追加到IP头部之后: ```python app_data = b'Some data to send...' payload_length = len(app_data) # Fill the total length field in the IP header with the correct value ip_header += struct.pack('!H', payload_length + 20) # Add 20 for the TCP/UDP header # Calculate the checksum of the IP header using the socket module's function ip_header_checksum = ip_checksum(ip_header) ip_header = ip_header.replace(b'\x00\x00\x00\x00', struct.pack('!H', ip_header_checksum)) # Add TCP/UDP header depending on your choice tcp_header = b'' udp_header = b'' if you_choose_tcp: tcp_header = ... # Create a TCP header here elif you_choose_udp: udp_header = ... # Create a UDP header here # Combine everything into one packet packet = ip_header + tcp_header or udp_header + app_data ``` 7. 发送数据包: ```python ip_socket.sendto(packet, (dst_ip, dst_port)) ``` 请注意,这个过程涉及到了很多细节和假设,实际操作可能会更复杂,比如错误处理、IP包校验和计算等。此外,发送原始IP包可能需要管理员权限,因为它绕过了防火墙和其他安全机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值