UDP 协议,怎么从外网推送消息到内网设备?

2019-05-23 14:47:48 +08:00
 a54552239

PHP,云端用 workerman 做 udp 服务器。硬件设备是单片机。现在的情况是,云端服务器可以接收从内网设备发出的数据,获取动态的 IP 和端口。但是不能根据这个获取到的 IP (公网)和端口号发送数据给设备,只能用内网 IP 和端口发送。用小米路由器的端口映射可以解决,不过不灵活。因为端口号是不固定的。希望有一个好的解决方案

5262 次点击
所在节点    程序员
39 条回复
TomVista
2019-05-23 15:53:55 +08:00
List<Socket > socketList = new List<Socket >();
Socket client= sc.Accept(); //服务器接收客户端 socket
socketList .Add(client);
socketList[0].send();//服务器利用客户端 socket 下发信息
opengps
2019-05-23 15:56:06 +08:00
@a54552239 肯定得持久化,系统要求在线轨迹不得低于 1 个月,历史轨迹不得低于 1 年的保存周期
a54552239
2019-05-23 15:56:06 +08:00
@TomVista 应该是正解了。我改业务代码去。。。
a54552239
2019-05-23 15:56:57 +08:00
谢谢各位的热心解答
@a54552239
@TomVista
@billzhuang
a54552239
2019-05-23 15:57:23 +08:00
感谢分享
@billzhuang
unixeno
2019-05-23 15:59:04 +08:00
@a54552239 UDP 不是链接的,存 socket 对象没啥用
你按客户端给你发过来的 ip 和端口回复回去就行
心跳的话,客户端给服务端发或者服务端给客户端发都是可以的
mirrorman
2019-05-23 17:10:06 +08:00
推测应该是客户端端口在一段时间之后挂了,你可以用其他服务器向客户端同一个端口发东西测试一下,Linux udp 底层的 socket 发到服务器是会把地址传过去的,正常的话服务器是能发回数据的
smdbh
2019-05-23 18:52:09 +08:00
udp 不是面向连接的,不明白 ls 的大佬的思路
tcp 不好么?
goofool
2019-05-23 19:20:47 +08:00
有几个单片机,如果只有一个可以用路由器开 DMZ
dabaibai
2019-05-23 19:43:55 +08:00
不行 运营商不允许这样
a54552239
2019-05-23 19:54:17 +08:00
@smdbh 硬件提供商用的 udp
a54552239
2019-05-23 19:54:24 +08:00
@goofool 有好几个呢
goofool
2019-05-23 21:08:21 +08:00
@a54552239 那就只能保持长连接,或者客户端轮询了
phithon
2019-05-23 22:02:58 +08:00
看看 unpn 协议吧,动态改端口映射
phithon
2019-05-23 22:03:31 +08:00
upnp 写错
ihciah
2019-05-24 00:11:16 +08:00
不想手动做端口映射,不想配 dmz 主机,不想用 tcp,那只有 upnp 了,前提是路由支持这东西。
KasuganoSoras
2019-05-24 03:00:04 +08:00
推测是你的心跳包间隔时间太长,客户端那头的端口关闭了,建议把心跳包间隔时间缩短,比如 10s,或者 5s。
可以参考我这个项目,PHP 写的聊天软件,基于 UDP: https://github.com/kasuganosoras/UChat
理论上服务器只要按原路把数据包发回客户端的 IP 和端口是能够正确传递回去的。
ho121
2019-05-24 06:53:22 +08:00
nicevar
2019-05-24 07:20:45 +08:00
有个东西叫 stun,楼主去看一下文档就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566961

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX