windows双网卡数据转发

yanquanheihei 2016-11-08 09:26:32


如上图所示:
B为一台双网卡主机,192和168两个IP段分别能与A和C进行Socket通讯。

问题场景:
A发给B的数据,如何同样的也发给C一份?或者说C如何能获取到A发给B的同样的数据?

注:IP不允许改动!
...全文
1777 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanquanheihei 2016-11-11
  • 打赏
  • 举报
回复
谢谢各位,问题解决了,在B上加了一个数据代理服务,在不改动Station和Center软件的前提下,实现了需求。
具体用到了ZeroMQ中的代理模式:


yanquanheihei 2016-11-09
  • 打赏
  • 举报
回复
引用 13 楼 diaodiaop 的回复:
所以 最终说到底 你还是不懂"道理". 什么地区 什么网段 什么VPN 根本不重要.. 难道我用VPN挂QQ 不能跟你在美国上QQ聊天吗? 在说了监听一个设备 跟100个设备有什么区别? 代码难道不是一样的? 既然你上这个图片. 也只能说 你的B跟B' 对A来说就是服务端 对C来说就是客户端. 也就是B是A跟C的中转 C是B跟B'的中转 B'是C跟A'的中转而已.. 所以如果A'要监控A的实时消息. 那就是A在"处理"的时候 发送给A-B-C-B'-A'而已.. 所以我觉得你还是先想清楚"流程"最好. 其实本来很简单的事弄的很复杂了..因为这跟网络网段地区VPN还有你那什么什么t什么什么s根本没关系.. 你这样只能让简单的东西越来越复杂.并且论坛的人一个人提一个技术....你真的觉得他们都懂 都做过? 信@以专业开发人员为伍 @sp1234 得永生
谢谢! 首先Station软件和Center软件已经根据自定义的通讯协议写好部署了,现在的需求是要在C上直接部署一套Center软件,在不改动Center软件的前提下,C和B是没法通讯的,即Center和Center之间是没有协议交互的,只有Center和Station之间有自定义的通讯协议可以交互,而现在需要的是Station既要能和B上的Center交互,也要能和C上的Center交互。
by_封爱 版主 2016-11-09
  • 打赏
  • 举报
回复
所以 最终说到底 你还是不懂"道理". 什么地区 什么网段 什么VPN 根本不重要.. 难道我用VPN挂QQ 不能跟你在美国上QQ聊天吗? 在说了监听一个设备 跟100个设备有什么区别? 代码难道不是一样的? 既然你上这个图片. 也只能说 你的B跟B' 对A来说就是服务端 对C来说就是客户端. 也就是B是A跟C的中转 C是B跟B'的中转 B'是C跟A'的中转而已.. 所以如果A'要监控A的实时消息. 那就是A在"处理"的时候 发送给A-B-C-B'-A'而已.. 所以我觉得你还是先想清楚"流程"最好. 其实本来很简单的事弄的很复杂了..因为这跟网络网段地区VPN还有你那什么什么t什么什么s根本没关系.. 你这样只能让简单的东西越来越复杂.并且论坛的人一个人提一个技术....你真的觉得他们都懂 都做过? 信@以专业开发人员为伍 @sp1234 得永生
yanquanheihei 2016-11-09
  • 打赏
  • 举报
回复
引用 15 楼 diaodiaop 的回复:
所以 说了这么多..你居然没看... 再见
谢谢,你说的对,可能是我没理解好,因为在不改动现有的Station软件和Center软件,除了在B上加一个数据转发服务,想不到还有什么办法可以把A的数据给到C
by_封爱 版主 2016-11-09
  • 打赏
  • 举报
回复
所以 说了这么多..你居然没看... 再见
  • 打赏
  • 举报
回复
如果你会编程,不妨贴出你的几行代码,看看有什么问题。 你这类问题是在是没法回答,因为它以一个从未学习过通讯编程的人的角度,问一个“业务实现”问题。而没有首先贴出你的涉及到技术的内容来问!
  • 打赏
  • 举报
回复
引用 楼主 yanquanheihei 的回复:
问题场景: A发给B的数据,如何同样的也发给C一份?或者说C如何能获取到A发给B的同样的数据?
只要是通讯程序设计,数据收发这是最基本的编程,没有谁不知道B可以将A发来的数据再发送给C的。 你可能只是要抄代码,而不是要问设计问题。
  • 打赏
  • 举报
回复
简单点,可以弄台服务器,负责数据读写,然后数据终端连代理服务器,通过它再与数据服务器通信,这样就不需要关心终端用的什么网段了。而且还可以通过代理服务器来控制终端的IP段和数量
  • 打赏
  • 举报
回复
TransferSeivice是可行的,不管两两是不是在一个局域网内 如果是在一个大的局域网内,只是IP段不同,是可以直接通信,可能是稍微设置下路由器或交换机。 就算不在一个局域网,也是可以通过代理服务器或者VPN之类的静态路由策略实行通信的
xuzuning 2016-11-08
  • 打赏
  • 举报
回复
A、C 不属于同一网段,不能直接通讯。只能通过 B 转发
yanquanheihei 2016-11-08
  • 打赏
  • 举报
回复
引用 1 楼 xian_wwq 的回复:
1.如果数据量不大,更新频率分钟级, 可以采用本地文件的方式进行数据接力。 B收到A的数据,在处理自己的业务同时,将数据落地,保存到本地文件,C通过解析B上的文件完成数据分享。 如果安全要求不高,可以把B上的指定目录映射成C机器的一个虚拟盘,这样C就可以直接操作文件,处理数据了。 2.如果频率要求比较高, 不想有太大开发工作量,在B部署数据库,是个比较快捷的方法。 A的数据写到数据库中,C到数据库中读取数据。 3.比较高效的,基于socket进行开发 B作为server,接收A发送的数据,同时通过socket将数据push到C
因为是处理实时数据,所以3可行,但是原来B只是接收数据、显示数据,现在要加上数据转发到C的逻辑,改动很大啊
引用 1 楼 xian_wwq 的回复:
1.如果数据量不大,更新频率分钟级, 可以采用本地文件的方式进行数据接力。 B收到A的数据,在处理自己的业务同时,将数据落地,保存到本地文件,C通过解析B上的文件完成数据分享。 如果安全要求不高,可以把B上的指定目录映射成C机器的一个虚拟盘,这样C就可以直接操作文件,处理数据了。 2.如果频率要求比较高, 不想有太大开发工作量,在B部署数据库,是个比较快捷的方法。 A的数据写到数据库中,C到数据库中读取数据。 3.比较高效的,基于socket进行开发 B作为server,接收A发送的数据,同时通过socket将数据push到C
谢谢!因为处理实时数据,所以3可行。可不可以这样,在B中放一个数据中转服务TransferSeivice,A的数据发给TransferSeivice,TransferSeivice收到后转发给B和C,B和C下发的数据也先发给TransferSeivice,TransferSeivice再转发给A?因为B和C中将要部署的软件只做显示数据和部分指令下发,最好是同样的软件
xian_wwq 2016-11-08
  • 打赏
  • 举报
回复
1.如果数据量不大,更新频率分钟级, 可以采用本地文件的方式进行数据接力。 B收到A的数据,在处理自己的业务同时,将数据落地,保存到本地文件,C通过解析B上的文件完成数据分享。 如果安全要求不高,可以把B上的指定目录映射成C机器的一个虚拟盘,这样C就可以直接操作文件,处理数据了。 2.如果频率要求比较高, 不想有太大开发工作量,在B部署数据库,是个比较快捷的方法。 A的数据写到数据库中,C到数据库中读取数据。 3.比较高效的,基于socket进行开发 B作为server,接收A发送的数据,同时通过socket将数据push到C
yanquanheihei 2016-11-08
  • 打赏
  • 举报
回复
引用 11 楼 diaodiaop 的回复:

void 连接方法()
if(客户端c.连接())
{
list.add(客户端C.ip,客户端socket实例)
}
void 收数据方法()
{
if(客户端A.有数据())
{
//你自己的处理流程.
var C=list...........
if(C.在线())
{
C.发送(客户端A.数据());
}
}
}



所以 真的只是流程的问题 根本涉及不到代码以及什么高深的技术.. 什么vpn TransferSeivice(这玩意是什么?)的


谢谢! 可能是我只截取了一部分业务图,说的不够清楚:


B、B'和C并不在同一地区,所以168网段是用VPN通过各自的外网卡组的。
A与C也不能简单的看成是Client,因为B与B’要各自监控3个设备,而C要监控所有的6个设备
by_封爱 版主 2016-11-08
  • 打赏
  • 举报
回复

void 连接方法()
if(客户端c.连接())
{
 list.add(客户端C.ip,客户端socket实例)
}
void 收数据方法()
{
  if(客户端A.有数据())
  {
    //你自己的处理流程.
    var C=list...........
    if(C.在线())
    {
      C.发送(客户端A.数据());
    }
  }
}
所以 真的只是流程的问题 根本涉及不到代码以及什么高深的技术.. 什么vpn TransferSeivice(这玩意是什么?)的
by_封爱 版主 2016-11-08
  • 打赏
  • 举报
回复
看了下你的业务以及图. 感觉你可能有误区. 首先 不管是双网卡还是8个网卡 跟你目前的流程来说 应该没任何关系..监听127.0.0.1 正如sp1234说的ip.any一样. 其次.我的猜想 可能是你的手机要通过服务器控制设备并且收到设备的返回值 这个流程. 所以这也属于业务的内容.而不是 纠结什么"网卡",同样也不要去纠结什么"网段", 因为你这是典型的tcp通讯机制 无非就是加点判断即可. 我们把你的A跟C 都当作tcp_client,那么在连接的时候 你要告诉tcpserver 你是谁.并且你要干什么.. 然后服务端会把不同的"客户端"(这里的不同指的是场景不同比如有设备有手机),分别装入对应的集合中. 那么A在发送数据的时候B收到了然后通过你自己的需求来判断是否要转发给"其他客户端", 如果转发 那么你一定有需求转发给谁,转发的对象是否在线. 如果都满足 只调用tcp_client.send就行了.
yanquanheihei 2016-11-08
  • 打赏
  • 举报
回复
引用 4 楼 dongxinxi 的回复:
TransferSeivice是可行的,不管两两是不是在一个局域网内 如果是在一个大的局域网内,只是IP段不同,是可以直接通信,可能是稍微设置下路由器或交换机。 就算不在一个局域网,也是可以通过代理服务器或者VPN之类的静态路由策略实行通信的
好的谢谢您!因为B和C两台设备不在同一个市,所以两台设备的IP是用VPN工具分配的IP。 A的站点软件和B的监控软件已经写好了,后期升级又要有C,就想能够尽量不改动或者少改动B的监控软件直接部署到C上
  • 打赏
  • 举报
回复
如果你的这个图是从同事那里抄来的(或者是一个不亲自搞编程的所谓的项目经理从网上随便抄来的),实在是想知道这里最基本的原理,我猜测着你们最基本的知识空白点,给你说一下: 1. 对 A 和C,它们各自都能作为 client 而连上 B,虽然使用的服务器 IP 不同,但是都是同一个服务器! 2. 服务器系统通常都是绑定 Address.Any 的,也就是所有网卡。当它接收到一个 client 端连接之后,其TcpClient 就被保存起来,准备随时发送数据使用;同时也可是监听 TcpClient 发来的数据。 3. A 和 C 自然要在连接到 B 之后,依据你们自己的业务通讯协议所说明的方式,说明自己的身份(例如是A还是B)。 4. 你们的服务器利用 2. 所准备的机制,在从一个 TcpClient 收到数据时,就把数据立刻发送给另一个数据。 如上,这是非常浅显的道理。这里谈不上多少技术的编程。如果你不能编程设计,那么说明你对于最基本的通讯是毫无经验的。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧