废话少说,直接上代码。服务端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示例相关推荐

  1. 利用 SSDP 协议生成 100 Gbps DDoS 流量的真相探秘

    原文地址 https://www.4hou.com/technology/5979.html 上个月我们分享过一些反射型DDoS攻击数据,SSDP攻击的平均大小是12 Gbps,我们记录的最大的反射式 ...

  2. python软件代码示例-python 示例代码1

    第一章 python基础一 ​在此不再赘述为什么学习python这门编程,网上搜索一箩筐.我在此仅说一句python的好,用了你就会爱上它. 本python示例代码1000+带你由浅入深的了解pyth ...

  3. pelco-d协议数据解析示例

    pelco-d协议数据解析示例 2014-08-14 21:57 286人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 程序编程(12) 作者同类文章X 代码工人的仓库(36) 作者同类文章 ...

  4. python 示例_带有示例的Python File write()方法

    python 示例 文件write()方法 (File write() Method) write() method is an inbuilt method in Python, it is use ...

  5. python 示例_带有示例的Python文件关闭属性

    python 示例 文件关闭属性 (File closed Property) closed Property is an inbuilt property of File object (IO ob ...

  6. python 示例_带有示例的Python date timetuple()方法

    python 示例 Python date.timetuple()方法 (Python date.timetuple() Method) date.timetuple() method is used ...

  7. python 示例_Python date isoweekday()方法与示例

    python 示例 Python date.isoweekday()方法 (Python date.isoweekday() Method) date.isoweekday() method is u ...

  8. python 示例_带有示例的Python date isocalendar()方法

    python 示例 Python date.isocalendar()方法 (Python date.isocalendar() Method) date.isocalendar() method i ...

  9. python 示例_带有示例的Python字典update()方法

    python 示例 字典update()方法 (Dictionary update() Method) update() method is used to update the dictionary ...

  10. python 示例_带有示例的Python字典popitem()方法

    python 示例 字典popitem()方法 (Dictionary popitem() Method) popitem() method is used to remove random/last ...

最新文章

  1. linux下oracle自动创建实例脚本
  2. [转]DotNet for Symbian平台 (Nokia,Sony,Motorola等手机)
  3. iOS开发网络篇—使用ASI框架进行文件下载
  4. 关注:Eclipse,转贴eclipse CDT的开发文章
  5. SecureCRT配置前--Linux网卡设置
  6. J2EE学习辅助工具资料列表及下载3(初学积累中)
  7. bash配置文件的修改
  8. Docker-学习笔记
  9. 最强大脑-高效记忆方法
  10. 【老生谈算法】matlab实现傅里叶变换算法源码——傅里叶变换
  11. 海森矩阵(Hessian)
  12. VUE3 响应式 API 之 toRef 与 toRefs
  13. 低压电工实操考核设备
  14. 【SAP】进项税的配置与传输
  15. log日志:打印日志到控制台、文件、日志文件分区、打印错误日志到文件
  16. SSM+基于Vue框架的在线投票系统的设计与实现 毕业设计-附源码
  17. 中国工业钩环市场深度研究分析报告
  18. ##如何通过写博客赚钱
  19. CANOpen中SDO和PDO的COB-ID理解
  20. 使用傲梅分区助手绿色版给C盘扩容

热门文章

  1. Python实现google翻译
  2. 半导体物理学习记录——概述
  3. idea实现Tomcat热部署
  4. Simulink电力系统仿真-三相短路
  5. linux-ab压力测试
  6. python django项目创建步骤
  7. 手机html5跑分,吊炸天的Chrome55内核来袭 360手机浏览器成“跑分王”
  8. 无线通信网络学习之LTE网络架构篇(20141208)
  9. excel 基础知识 入门
  10. 计算机服务怎么打开flash,快速讲解Win10自带的浏览器如何开启Adobe Flash?