一些概念
- 文件描述符
- 可以是一个整数形式的文件描述符,比如 sys.stdin.fileno() 的返回结果,或为 io.IOBase 对象,比如 sys.stdin 提供一个 fileno(),可返回一个真正的文件描述符。
常用包
socket
- 比较底层的API接口,该模块提供对 BSD套接字接口的访问。它适用于所有现代 Unix 系统、Windows、MacOS 以及可能的其他平台。
- 每一个socket name都是一个地址族(address family) ,常用的地址族就是AF_INET(host,port) 以及 AF_UNIX(string形式返回的bytes-like object) [其他的AF还有很多… 比如AF_INET6 ]
reference: 官方API:address family
- 所以说有时候会看到sock.getsockname()[1],如果采用的是AF_INET,[0] 就是host ip ( in string format ),[1]就是port ( in int format )
- 但,也可能采用的是AF_UNIX地址,这个是在socket创建的时候指定的
- 所以说有时候会看到sock.getsockname()[1],如果采用的是AF_INET,[0] 就是host ip ( in string format ),[1]就是port ( in int format )
fcntl
-
用于操控文件描述符,实际上是系统的API,python中有对应的包
-
python 使用ioctl() 获得网卡IP 和MAC地址
- 代码
from fcntl import ioctl import socket import struct import sys sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) try: ip=ioctl(sock.fileno(),0x8915,struct.pack('64s','eth0')) ip=socket.inet_ntoa(ip[20:24]) print ip except: print sys.exc_info()
- 我理解SIOCGIFADDR的意思是 socket IO get Interface Address
more reference about ioctl : 知乎的函数API讲解
struct
- 用于格式化/解析字符串
- struct.pack(fmt,v1,v2,…) --> a packed string
- struct.unpack(fmt,string) --> a tuple of string
- reference : 这个blog不错的
some demo codes
- extras/sflow.py in sflow-rt 居然还可以显示拓扑
from mininet.net import Mininet from mininet.log import info from mininet.util import quietRun from os import listdir, environ from json import dumps from re import match from fcntl import ioctl from array import array from struct import pack, unpack from sys import maxsize import socket import sys try: from urllib.request import build_opener, HTTPHandler, Request except ImportError: from urllib2 import build_opener, HTTPHandler, Request def wrapper(fn):