基础知识九、Python解析网络报文之搭建基本框架


       为进一步加深对计算机网络中网路协议的理解,经过前几节实现了线程池之后下面几节我们基于线程池进行网络协议报文的解析,本节我们通过socket监听本机ip和port,循环读取数据并交由异步的任务处理对象进行报文的解析。

一、实现报文解析任务对象

       继承第六节的异步任务对象,在异步处理方法process中编写解析逻辑

class ServerProcessTask(AsyncTask):

    def __init__(self, packet, *args, **kwargs):
        """
        定义异步处理任务
        :param packet:
        :param args:
        :param kwargs:
        """
        super(ServerProcessTask, self).__init__(func=self.process, *args, **kwargs)
        self.packet = packet

    def process(self):
        """
        异步处理方法
        :return:
        """
        headers = {
            'network_header': None,
            'transport_header': None
        }
		# to be continued

        return headers

二、搭建基本框架

       创建socket对象,指明工作的协议为IP协议,绑定本机的IP和port,为socket设置为混杂模式–接收所有经过网卡设备的数据,通过之前实现的线程池处理报文解析任务对象,获取异步结果。

class Server:

    def __init__(self):
        # 创建socket 指明工作协议类型(IPv4) 套接字类型 工作具体的协议(IP协议)
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

        # 设置自己的主机ip和端口
        self.ip = '192.168.31.47'
        self.port = 8888
        self.sock.bind((self.ip, self.port))

        # 设置混杂模式 接受所有经过网卡设备的数据
        self.sock.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

        # 初始化线程池
        self.pool = ThreadPool(10)
        self.pool.start()

    def loop_server(self):
        """
        循环读取网络数据
        :return:
        """
        while True:
            packet, addr = self.sock.recvfrom(65535)
            task = ServerProcessTask(packet)
            self.pool.put(task)
            result = task.get_result()
            result = json.dumps(result, indent=4)
            print(result)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值