zoukankan      html  css  js  c++  java
  • python: with的使用;

    with适用于对资源进行访问的场合,不论使用过程中是否发生异常都执行必要的“清理”操作,释放资源,比如文件资源的关闭,线程锁的获取和释放等;

    with与上下文管理器相关: 

    上下文管理协议:  包含__enter__()、__exit__()两个方法;

    例子: 

    # coding: utf-8
    import socket
    
    
    class PrepareSock(object):
        def __init__(self):
            host = socket.gethostbyname(socket.gethostname())
            sock = socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.IPPROTO_IP)     # 原始套接字;
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)          # 打开地址复用功能;
            sock.bind((host, 0))                                         # 绑定地址,公共接口;
            sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)        # 设置数据保护IP头部
            sock.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)             # 开启混杂模式;
            self.sock = sock
    
        def __enter__(self):
            return  self.sock
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            self.sock.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)           # 关闭混杂模式;
    
    
    class Sniffer(object):
        def __init__(self):
            pass
    
        def sniffer(self, count, buffsize = 65535, showPort = False, showRawData = False):
            with PrepareSock() as sock:                      # with使用;
                for i in xrange(count):
                    pakege = sock.recvfrom(buffsize)
                    self.printPacket(pakege, showPort, showRawData)
    
        def printPacket(self, package, showPort, showRawData):
            dataIndex = 0
            headerIndex = 1
            ipAddressIndex = 0
            portIndex = 1
    
            print 'IP:', package[headerIndex][ipAddressIndex]
            if showPort:
                print 'Port:', package[headerIndex][portIndex]
            if showRawData:
                print 'Data:', package[dataIndex]
    
    
    if __name__ == "__main__":
        sniffer = Sniffer()
        sniffer.sniffer(50, 65535, True, True)
  • 相关阅读:
    Django框架(二)
    USACO 2019 December Contest 随记
    Codeforces 1249E By Elevator or Stairs? 题解
    NIKKEI Programming Contest 2019-2 D 部分分题解
    Codeforces 1196D2 RGB Substring (Hard version) 题解
    HDU5943 Kingdom of Obsession 题解
    智能账单统计软件开发日志3 图像比对算法
    Codeforces #536 A..D 题解
    智能账单统计软件开发日志2 图像形态优化
    智能账单统计软件开发日志1 立项与环境配置
  • 原文地址:https://www.cnblogs.com/yinwei-space/p/9433748.html
Copyright © 2011-2022 走看看