搜索
bottom↓
回复: 32

求一款服务端数据转发软件

[复制链接]

出5入4汤圆

发表于 2018-4-16 14:46:07 | 显示全部楼层 |阅读模式
本帖最后由 tim4146 于 2018-4-16 14:47 编辑

网络结构看下面的图片


1、套接字A和套接字C都通过TCP连接到了套接字B;
2、由于C不是公网IP,A想要直接连C是不可能的,希望通过B转发。即,A把数据发给B,B把数据发给C,C回复信息给B,B把回复信息发给A
3、如果有别的更好的办法大家也指点一下,限制条件:A和B都是PC,C只是普通的网关设备,无法做更多的事情了

BTW 为什么火狐浏览器无法上传和添加图片

编辑原因:修改莫元数量和增加文字

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-4-16 14:59:40 | 显示全部楼层
搜索sokit 很棒的一直在用

出0入0汤圆

发表于 2018-4-16 15:13:27 | 显示全部楼层
用frp反向代理,A作为服务端,C可以通过B连接到A

出0入0汤圆

发表于 2018-4-16 15:35:17 | 显示全部楼层
这种适合用MQTT协议

出0入0汤圆

发表于 2018-4-16 15:40:15 | 显示全部楼层
B的IP地址用花生壳映射

出5入4汤圆

 楼主| 发表于 2018-4-16 15:43:05 | 显示全部楼层
Zphoenix 发表于 2018-4-16 15:13
用frp反向代理,A作为服务端,C可以通过B连接到A

感谢。
您说的这个这个办法是让A做内网穿透以便暴露给C
我这边一般是A主动发报文给C(假设已经建立TCP连接),C收到之后发回复报文,并且A需要虚拟出一个串口(把某个TCP连接虚拟成串口),通过这个串口和C通信

出5入4汤圆

 楼主| 发表于 2018-4-16 15:44:06 | 显示全部楼层
openmcu666 发表于 2018-4-16 15:40
B的IP地址用花生壳映射

B已经是公网IP了,B作为服务器可以和A C通信的

出5入4汤圆

 楼主| 发表于 2018-4-16 15:49:57 | 显示全部楼层
solojimes 发表于 2018-4-16 14:59
搜索sokit 很棒的一直在用

这个软件上次下载测试了一下,发现没有成功转发,刚刚又试了一下,还是不行,您帮忙看看呢,我截图

上图中,我打开了两次软件(因为软件似乎只能建立一个客户端,不像其他的TCP UDP测试工具),通过客户端连接了服务端

可以看到,服务端被两个端口连接上了下面我来设置一下转发

把之前的两个连接设置成转发
然后在某一个客户端里面发数据给服务端,并未发现有数据准发到另一个客户端那边

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-4-16 15:58:31 | 显示全部楼层
本帖最后由 Zphoenix 于 2018-4-16 16:02 编辑
tim4146 发表于 2018-4-16 15:43
感谢。
您说的这个这个办法是让A做内网穿透以便暴露给C
我这边一般是A主动发报文给C(假设已经建立TCP连 ...


理解错误了

出0入0汤圆

发表于 2018-4-16 16:06:04 | 显示全部楼层
LZ要找的不就是MQTT嘛

出5入4汤圆

 楼主| 发表于 2018-4-16 16:22:22 | 显示全部楼层
solojimes 发表于 2018-4-16 14:59
搜索sokit 很棒的一直在用



测试了一下,转发成功了,但是有个问题, 转发页面配置的两个端口号都作为服务端口了,还是没法满足我的需求
我的需求更像是下面的图片,建立了6000端口作为服务端,随机两个客户端套接字(小明和小张)连上了6000,需要端口6000作为中间桥梁,透传小明主动发给小张的数据,和小张的返回报文(modbus通讯)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入4汤圆

 楼主| 发表于 2018-4-16 16:29:37 | 显示全部楼层
avr-arm 发表于 2018-4-16 16:06
LZ要找的不就是MQTT嘛

看了一下MQTT的介绍,真的很强大啊,但是我的A是PC可以用MQTT,C设备不具备编程可能怎么办...只能用内网IP连接服务器B,没别的本事

出0入0汤圆

发表于 2018-4-16 16:37:18 | 显示全部楼层
自己写个转发协议不就ok了,每个端口号带两个设备,连协商都省了

出0入0汤圆

发表于 2018-4-16 16:40:25 | 显示全部楼层
tim4146 发表于 2018-4-16 16:29
看了一下MQTT的介绍,真的很强大啊,但是我的A是PC可以用MQTT,C设备不具备编程可能怎么办...只能用内网I ...

C看你写的是网关设备,一般单片机都可以跑MQTT

出5入4汤圆

 楼主| 发表于 2018-4-16 16:46:01 | 显示全部楼层
avr-arm 发表于 2018-4-16 16:40
C看你写的是网关设备,一般单片机都可以跑MQTT

C设备是一台4G数据传输模块,单片机操作了全网通集成模块,主要是通过串口配置一些参数,网络协议栈在集成模块里面了,没在单片机上

出0入0汤圆

发表于 2018-4-16 14:46:08 | 显示全部楼层
看看这个软件是不是你需要的~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入4汤圆

 楼主| 发表于 2018-4-16 16:50:54 | 显示全部楼层
canopen 发表于 2018-4-16 16:37
自己写个转发协议不就ok了,每个端口号带两个设备,连协商都省了

是的,查了很多的资料,还是准备自己在服务器上面写个小demo试试了,理论上只要服务端有两个客户端的socket信息就可以转发的

出0入0汤圆

发表于 2018-4-16 16:54:19 | 显示全部楼层
本帖最后由 dr2001 于 2018-4-16 16:56 编辑

服务器是Linux环境的话,socat了解一下,老环境就是nc (netcat)。职业网络转发工具。
缺点是两个端口listen。

单端口listen考虑过怎么判断通信对么?没问题的话,自己写个也不费事儿。

出5入4汤圆

 楼主| 发表于 2018-4-16 17:00:12 | 显示全部楼层
st8051 发表于 2018-4-16 16:48
看看这个软件是不是你需要的~

感谢,试了,确实是我需要的,这个小工具自己写的话不知道难不难

出5入4汤圆

 楼主| 发表于 2018-4-16 17:02:04 | 显示全部楼层
dr2001 发表于 2018-4-16 16:54
服务器是Linux环境的话,socat了解一下,老环境就是nc (netcat)。职业网络转发工具。
缺点是两个端口listen ...

接受方会返回回复报文,所有报文CRC,这样应该能保证数据正确

出0入0汤圆

发表于 2018-4-16 17:07:05 | 显示全部楼层
本帖最后由 dr2001 于 2018-4-16 17:10 编辑
tim4146 发表于 2018-4-16 17:02
接受方会返回回复报文,所有报文CRC,这样应该能保证数据正确


端口转发数据本身非常简单,代码没几行。问题是配对之类的。

如果你会nim,端口转发的非常简单的代码:

  1. # buffer size for data forward.
  2. const buf_size = 2048

  3. import os, ospaths, strutils, parsecfg
  4. import asyncdispatch, asyncnet

  5. type
  6.     Args_t = ref object
  7.         port_local  : uint16

  8.     Serv_t = ref object
  9.         serv        : AsyncSocket       # for server listen proxy.

  10. proc async_data_forward(src: AsyncSocket, dst: AsyncSocket, dir: string) {.async.} =
  11.     ## forward data, return when socket closed.
  12.     ## - socket closed -> src.recvInto return length 0 :OR: recv/send raise an exception.
  13.     var buf : array[1 .. buf_size, uint8]
  14.     while true:
  15.         try:
  16.             let rx_len = await src.recvInto(buf.addr, buf_size)
  17.             if rx_len == 0:
  18.                 break
  19.             await dst.send(buf.addr, rx_len)
  20.         except:
  21.             break

  22. proc async_server(s: Serv_t) {.async.} =
  23.     while true:
  24.         # wait connections.
  25.         let proxy = await s.serv.accept()
  26.         let debug = await s.serv.accept()

  27.         # forward data, await completes if any forward thread completes.
  28.         var x = async_data_forward(proxy, debug, "server: proxy -> debug: ")
  29.         var y = async_data_forward(debug, proxy, "server: debug -> proxy: ")
  30.         await x or y

  31.         # close connection.
  32.         proxy.close()
  33.         debug.close()

  34. proc role_server(a: Args_t) =
  35.     var s   = new(Serv_t)
  36.     s.serv  = newAsyncSocket(buffered=false)

  37.     # server: bind and listen
  38.     try:
  39.         s.serv.setSockOpt(OptReuseAddr, true)
  40.         s.serv.bindAddr(Port(a.port_local))
  41.         s.serv.listen()
  42.     except:
  43.         s.serv.close()
  44.         return

  45.     # poll dispatcher until completed.
  46.     waitFor async_server(s)

  47. proc main() =
  48.     # extract argument/settings
  49.     var arg = new(Args_t)
  50.     arg.port_local = 2189

  51.     role_server(arg)

  52. when isMainModule:
  53.     main()
复制代码


用C之类的写这种东西略麻烦,因为两个socket要poll。
带有比较好的多线程/异步库的高级语言就会省事儿的多,而且Linux/Windows通吃,比如Go,Rust,Nim,Python,etc。

出0入0汤圆

发表于 2018-4-16 17:17:44 | 显示全部楼层
收藏备用,谢谢!

出0入0汤圆

发表于 2018-4-16 17:18:26 | 显示全部楼层
可以考虑用frp搞定

出20入186汤圆

发表于 2018-4-16 17:26:10 | 显示全部楼层
不需要转发,只需要服务器 打洞即可,

出0入0汤圆

发表于 2018-4-16 19:42:37 | 显示全部楼层
tim4146 发表于 2018-4-16 16:46
C设备是一台4G数据传输模块,单片机操作了全网通集成模块,主要是通过串口配置一些参数,网络协议栈在集 ...

原来如此

出0入168汤圆

发表于 2018-4-16 20:26:52 | 显示全部楼层
也在找这样的软件。

出90入4汤圆

发表于 2018-4-16 20:33:56 | 显示全部楼层
正在做专用的类似的东西。如果C不能二次开发,在BC之间增加一个网络模块,就可以了。

出0入168汤圆

发表于 2018-4-16 21:04:44 | 显示全部楼层
st8051 发表于 2018-4-16 16:48
看看这个软件是不是你需要的~

这个程序很好用,不知道能支持多少个客户端。

出5入4汤圆

 楼主| 发表于 2018-4-16 21:13:22 | 显示全部楼层
john78 发表于 2018-4-16 20:33
正在做专用的类似的东西。如果C不能二次开发,在BC之间增加一个网络模块,就可以了。 ...

思考过使用花生壳的硬件:花生棒,但是设备C是插的SIM卡,网络是移动给的,不是现场的局域网,不好搞

出5入4汤圆

 楼主| 发表于 2018-4-16 21:31:09 | 显示全部楼层
dr2001 发表于 2018-4-16 17:07
端口转发数据本身非常简单,代码没几行。问题是配对之类的。

如果你会nim,端口转发的非常简单的代码:

感谢啊,可惜您这个代码我还看不懂,没用过这个语言
顺便问一句,这种socket数据转发用MFC应该好做的吧,用C#呢?

出5入4汤圆

 楼主| 发表于 2018-4-16 21:34:49 | 显示全部楼层
st8051 发表于 2018-4-16 14:46
看看这个软件是不是你需要的~

这个软件发送方发出数据之后会立马收到“OK”,如果能配置一下关闭这个功能就好了,因为接收方一般是提供服务的,收到了发送方的数据之后自然会有报文回复过去,这个软件帮忙回复了“OK”是没有必要的

出0入0汤圆

发表于 2018-4-17 08:47:35 | 显示全部楼层
tim4146 发表于 2018-4-16 21:31
感谢啊,可惜您这个代码我还看不懂,没用过这个语言
顺便问一句,这种socket数据转发用MFC应该好做的吧, ...

之前提过了,Socket透传这事儿非常非常简单,收数据,然后发即可。
用C的话,主要是Windows和Linux不通用,要两套代码,代码量倒是很小。

我相信你这个东西不是自己娱乐之用或者自家特定设备调试,所以,麻烦的是如何进行配对,用户管理这些事情,而不是转发。

应用逻辑的完善可靠是最麻烦的。

出0入0汤圆

发表于 2018-4-17 09:49:49 来自手机 | 显示全部楼层
要用socket透传,学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 11:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表