实现upnp ssdp来查找局域网内的其他节点
upnp协议常用于一些智能家居产品中,这些产品连上家里局域网后,用同样连入家中局域网的手机就能很快检测到此产品了。在区块链技术中,upnp也被应用于寻找同一局域网内的其他节点。
关于upnp的具体描述,这篇文章有很好的介绍,Exploring UPnP with Python,欢迎移步查看。我在这里粗略的介绍下。upnp里面有好几种具体的实现方式,这里介绍下用的最多的ssdp。ssdp一般有服务器端和客户端。服务器端会使用udp监听端口1900的广播信息,如果信息里面有“M-SEARCH”开头的字段,就会回复自己的产品信息,也就是被找到了。而客户端程序就会在局域网内发送端口1900的udp广播信息,来寻找服务器。具体到区块链中,一个节点实例既运行ssdp的服务器程序,也运行ssdp的客户端程序,这样这个节点既能找到局域网内的其他节点,也能被其他节点找到。
在用到upnp的时候还有个功能常被用到,就是nat port forwarding,把局域网内的本地端口绑定到路由器上的端口,使运行在局域网内的程序能够转化为在公网上能够互相通信的程序了。这样,互联网上的其他的节点就能根据节点列表主动连接处于局域网内的节点了。它的代码基本逻辑是处于局域网内的程序首先使用upnp协议寻找到局域网的路由器,然后这个路由器必须要有nat port forwarding的功能,然后程序就能调用路由器的这个功能,把本地端口绑定到路由器的外部端口。
我根据文章实现了一个ssdp的python程序,tw7613781/ssdp_upnp,也上传到了pypi,大家使用下面命令就能按照包文件,使用这个程序。考虑到他们是会阻塞线程的,在具体实现的时候,我让这两个class都继承了thread.Threading类,让他俩跑到自己的子线程去,然后使用线程安全的python内置queue来通信。既客户端类找到其他节点后把节点ip,port信息写到queue里,然后主线程能在queue读到这个信息,然后进行自己的业务逻辑。
pip install ssdp-upnp
实现upnp ssdp来查找局域网内的其他节点的更多相关文章
- c# asp.net 鼠标改变控件坐标位置,更改控件坐标,注册表保存读取,打印,查找局域网内打印机等等收集
界面虽然被我弄的很难看,但功能还可以 里边注册表的路径自己设置一下,或者加一个创建注册表的语句,不然会报错 前台: <%@ Page Language="C#" AutoEv ...
- Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++
Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++ 1. 查找nas的原理1 2. 与dlna的关系1 3. 与ssdp的关系1 4. Cling - Ja ...
- Snmp协议应用-扫描局域网内打印机
.h2cls { background: #6fa833 none repeat scroll 0 0 !important; color: #fff; font-family: "微软雅黑 ...
- 配置Apache将自己的电脑做服务器使局域网内的电脑访问自己的主机
很多的朋友都想把自己的电脑打造为服务器使别人能够访问.比如说你自己写了一网站,只能自己通过localhost访问或127.0.0.1访问.但是怎么让别人的电脑也能访问呢?来看看自己写的网站.现在我来讲 ...
- vue——同一局域网内访问项目
1.想要在手机上访问本地的vue项目,首先要保证手机和电脑处在同一局域网内(连着同一个无线网) 2.将你电脑的ip设置为固定ip(ipconfig查找本地的ip,然后修改它,改为你想变的数字) 3.在 ...
- 使用 Python 查看局域网内存活主机
1 安装 (如果误用了 pip insatll nmap的话,要先 pip uninstall nmap) pip install python-nmap Nmap 是一款用于网络发现和安全审计的网络 ...
- 局域网内利用gitlab,jenkins自动生成gitbook并发布(nginx)
安装了GitBook,内网使用,没法用上gitbook的网页. 用gitbook serve只能展示一本书,而且也不利于长期维护. 于是使用gitlab,jenkins,和nginx配合gitbook ...
- Windows下查看局域网内某台计算机的MAC地址
我们知道在局域网中,在Windows下,查看局域网内其他主机的ip和对应mac地址的命令是: arp -a 这样可以看到ip和mac地址的对应关系,还是比较方便的 但是有些时候使用arp命令并不能列出 ...
- 查询局域网内在线电脑IP
COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑IP :send @ECHO off&setlocal enabledelayedexpansion ECHO 正 ...
随机推荐
- HDU - 4734 F(x) (数位dp)
For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n ...
- SQL Server数据库中表的查
DataSet 数据集 DataAdapter 数据适配器,DataSet对象与实际数据源之间的桥梁,自动开闭数据库连接,省略Open.Close.填充数据集,需要用到Fill方法. using Sy ...
- python验证卡普耶卡(D.R.Kaprekar)6174猜想
1955年,卡普耶卡(D.R.Kaprekar)对4位数字进行了研究,发现一个规律: 对任意各位数字不相同的4位数,使用各位数字能组成的最大数减去能组成的最小数,对得到的差重复这个操作,最终会得到61 ...
- Word转PDF(SaveAsPDFandXPS + jacob)
Windows系统下 1.下载所需插件和jar包 SaveAsPDFandXPS(微软自带office转PDF.XPS):http://www.microsoft.com/zh-cn/download ...
- .NET面试题系列(十八)常用关键字
序言 const和readonly关键字 private protected public internal的区别 out ref out适合用在需要retrun多个返回值的地方,而ref则用在需要 ...
- JGUI源码:实现图标按钮及下拉菜单(16)
效果如下 代码片段如下 <div class="jgui-btn" id="personalbtn" style="float:right;&q ...
- echo 输入背景和字体常用方法
ECHO输出背景颜色以及文字颜色输出格式: echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"例如: echo -e & ...
- iview-admin安装
桌面创建project文件夹. 文件夹内右键选择gitbash here,输入git init.文件夹内会生成.git文件夹. 再输入git config --global user.name &qu ...
- 记一场与 cookie 的相遇
简介: cookie 翻译过来为 “小甜点,一种酥性甜饼干,很美味的...”,咳咳,打住!我们这里说的是 “甜点” 文件,它是浏览器储存在用户电脑上的一小段纯文本格式的文件. 由于 http 是一种无 ...
- TypeScript 错误property does not exist on type Object
TypeScript 错误property does not exist on type Object 在TypeScript中如果按JS的方式去获取对象属性,有时会提示形如Property 'val ...