SSDP协议的Python示例
废话少说,直接上代码。服务端ssdp_server.py:
# -*- coding: utf-8 -*-import socketSSDP_ADDR = '239.255.255.250'
SSDP_PORT = 1900
SERVICE_NAME = 'my_service'class Connection():def __init__(self, s, data, addr):self.__s = sself.__data = dataself.__addr = addrself.is_find_service = Falsedef handle_request(self):if self.__data.startswith('M-SEARCH * HTTP/1.1\r\n'):self.__handle_search()elif self.__data.startswith('HTTP/1.1 200 OK\r\n'):self.__handle_ok()def __handle_search(self):props = self.__parse_props(['HOST', 'MAN', 'ST', 'MX'])if not props:returnif props['HOST'] != '%s:%d' % (SSDP_ADDR, SSDP_PORT) \or props['MAN'] != '"ssdp:discover"' \or props['ST'] != 'ssdp:all':returnprint 'RECV: %s' % str(self.__data)print 'ADDR: %s' % str(self.__addr)response = 'HTTP/1.1 200 OK\r\nST: %s\r\n\r\n' % SERVICE_NAMEself.__s.sendto(response, self.__addr)def __handle_ok(self):props = self.__parse_props(['ST'])if not props:returnif props['ST'] != SERVICE_NAME:returnprint 'RECV: %s' % str(self.__data)print 'ADDR: %s' % str(self.__addr)print 'Find service!!!!'self.is_find_service = Truedef __parse_props(self, target_keys):lines = self.__data.split('\r\n')props = {}for i in range(1, len(lines)):if not lines[i]:continueindex = lines[i].find(':')if index == -1:return Noneprops[lines[i][:index]] = lines[i][index + 1:].strip()if not set(target_keys).issubset(set(props.keys())):return Nonereturn propsclass SSDPServer():def __init__(self):self.__s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)self.__s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)local_ip = socket.gethostbyname(socket.gethostname())any_ip = '0.0.0.0'# 绑定到任意地址和SSDP组播端口上self.__s.bind((any_ip, SSDP_PORT))# INFO: 使用默认值# self.__s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 20)# self.__s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)# self.__s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF,# socket.inet_aton(intf) + socket.inet_aton('0.0.0.0'))# INFO: 添加到多播组self.__s.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP,socket.inet_aton(SSDP_ADDR) + socket.inet_aton(local_ip))self.local_ip = local_ipdef start(self):while True:data, addr = self.__s.recvfrom(2048)conn = Connection(self.__s, data, addr)conn.handle_request()self.__s.setsockopt(socket.SOL_IP, socket.IP_DROP_MEMBERSHIP,socket.inet_aton(SSDP_ADDR) + socket.inet_aton(self.local_ip))self.__s.close()if __name__ == '__main__':port = SSDPServer()port.start()
客户端ssdp_client.py:
# -*- coding: utf-8 -*-import socket
import time
import select
import ssdp_serverSSDP_ADDR = '239.255.255.250'
SSDP_PORT = 1900MS = 'M-SEARCH * HTTP/1.1\r\nHOST: %s:%d\r\nMAN: "ssdp:discover"\r\nMX: 2\r\nST: ssdp:all\r\n\r\n' \% (SSDP_ADDR, SSDP_PORT)class SSDPClient():def __init__(self):self.__s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# INFO: 若绑定,服务端收到的是固定的地址和端口号self.__s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)local_ip = socket.gethostbyname(socket.gethostname())self.__s.bind((local_ip, 50000))def start(self):self.__send_search()while True:reads, _, _ = select.select([self.__s], [], [], 5)if reads:data, addr = self.__s.recvfrom(2048)conn = ssdp_server.Connection(self.__s, data, addr)conn.handle_request()if conn.is_find_service:breakelse: # timeoutself.__send_search()self.__s.close()def __send_search(self):print "Sending M-SEARCH..."# INFO: 发送到SSDP组播地址上self.__s.sendto(MS, (SSDP_ADDR, SSDP_PORT))if __name__ == '__main__':port = SSDPClient()port.start()
SSDP协议的Python示例相关推荐
- 利用 SSDP 协议生成 100 Gbps DDoS 流量的真相探秘
原文地址 https://www.4hou.com/technology/5979.html 上个月我们分享过一些反射型DDoS攻击数据,SSDP攻击的平均大小是12 Gbps,我们记录的最大的反射式 ...
- python软件代码示例-python 示例代码1
第一章 python基础一 在此不再赘述为什么学习python这门编程,网上搜索一箩筐.我在此仅说一句python的好,用了你就会爱上它. 本python示例代码1000+带你由浅入深的了解pyth ...
- pelco-d协议数据解析示例
pelco-d协议数据解析示例 2014-08-14 21:57 286人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 程序编程(12) 作者同类文章X 代码工人的仓库(36) 作者同类文章 ...
- python 示例_带有示例的Python File write()方法
python 示例 文件write()方法 (File write() Method) write() method is an inbuilt method in Python, it is use ...
- python 示例_带有示例的Python文件关闭属性
python 示例 文件关闭属性 (File closed Property) closed Property is an inbuilt property of File object (IO ob ...
- python 示例_带有示例的Python date timetuple()方法
python 示例 Python date.timetuple()方法 (Python date.timetuple() Method) date.timetuple() method is used ...
- python 示例_Python date isoweekday()方法与示例
python 示例 Python date.isoweekday()方法 (Python date.isoweekday() Method) date.isoweekday() method is u ...
- python 示例_带有示例的Python date isocalendar()方法
python 示例 Python date.isocalendar()方法 (Python date.isocalendar() Method) date.isocalendar() method i ...
- python 示例_带有示例的Python字典update()方法
python 示例 字典update()方法 (Dictionary update() Method) update() method is used to update the dictionary ...
- python 示例_带有示例的Python字典popitem()方法
python 示例 字典popitem()方法 (Dictionary popitem() Method) popitem() method is used to remove random/last ...
最新文章
- linux下oracle自动创建实例脚本
- [转]DotNet for Symbian平台 (Nokia,Sony,Motorola等手机)
- iOS开发网络篇—使用ASI框架进行文件下载
- 关注:Eclipse,转贴eclipse CDT的开发文章
- SecureCRT配置前--Linux网卡设置
- J2EE学习辅助工具资料列表及下载3(初学积累中)
- bash配置文件的修改
- Docker-学习笔记
- 最强大脑-高效记忆方法
- 【老生谈算法】matlab实现傅里叶变换算法源码——傅里叶变换
- 海森矩阵(Hessian)
- VUE3 响应式 API 之 toRef 与 toRefs
- 低压电工实操考核设备
- 【SAP】进项税的配置与传输
- log日志:打印日志到控制台、文件、日志文件分区、打印错误日志到文件
- SSM+基于Vue框架的在线投票系统的设计与实现 毕业设计-附源码
- 中国工业钩环市场深度研究分析报告
- ##如何通过写博客赚钱
- CANOpen中SDO和PDO的COB-ID理解
- 使用傲梅分区助手绿色版给C盘扩容