实现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 正 ...
随机推荐
- Exp2 后门原理与实践
一.基础问题回答 (注:本实验中在win7上使用的ncat.exe和socat.exe均可在实验指导的附件中下载) 1.例举你能想到的一个后门进入到你系统中的可能方式? 答:非官方网站下载资源时,可能 ...
- js根据毫米/厘米算像素px
<html><meta http-equiv="content-type" content="text/html;charset=utf-8" ...
- [源码分析]读写锁ReentrantReadWriteLock
一.简介 读写锁. 读锁之间是共享的. 写锁是独占的. 首先声明一点: 我在分析源码的时候, 把jdk源码复制出来进行中文的注释, 有时还进行编译调试什么的, 为了避免和jdk原生的类混淆, 我在类前 ...
- RabbitMQ installation
以windows环境测试 Erlang http://www.erlang.org/downloads 下载并安装 运行时软件 Erlang OTP 21.3 Windows 64-bit Binar ...
- PHP代码审计之命令注入
命令注入 命令注入就是通过利用无验证变量构造特殊语句对服务器进行渗透. 注入的种类有很多,而不仅仅是SQL Injection. php常见注入有以下几种(常见:,常见!!): 命令注入 (Comma ...
- (Python3 自定义函数实现数字金字塔 代码
def kzkz(ceng): for i in range(1,ceng+1): print(" "*(ceng-i),end='') n=i while(n>=1): p ...
- 【SQL学习笔记】一、select语句
SQL有别于其他的编程语言的一点在于首先处理的并不是写在第一行的语句(select),而是from字句. 为了更详细的了解select语句的每个部分,举例如下: 该语句返回的结果是下订单超过4次的女顾 ...
- django --视图装饰器
- Flask 之东方不败一
1,flask的初始 flask是Python的一个轻量级的web框架,相当于django而言. 知识点Python 三大主流web框架的对比 1.Django 主要特点是大而全,集成了很多组件,例如 ...
- springboot 共享session
1.pom添加jar依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifact ...