局域网里的服务器发送数据给客户端用什么协议比较好,UPD还是广播?

96掌门师兄 2014-06-12 10:45:29
现在我有一个服务器OPCServer,负责实时收取PLC的数据,然后可以有多个OPCClient客户端连接到OPCServer,OPCServer收到数据后要将数据转发给所有的客户端,才用什么方式比较好呢?

要求延时在50ms以内。
个人觉得如果 OPCClient和OPCServer用TCP链路,这样Server就要将一个数据,分别发送给多个客户端,就会有
for(int iClient = 0; iClient < iCurClientNum; iClient++)
{
send()
.......
}
这样的逻辑代码,如果客户端稍微多一些,数据稍微发送频率高一些,那么会不会延时较大呢?如果延时较大,线程就会在这个地方耗时比较久, 毕竟循环发数据是有时间消耗的。
这样实时性就差了。

当然用异步socket的话,不会阻塞很久,只要缓冲区空,就会立即发送出去。 当客户端较少的时候,这个时间不知道能不能忽略。

没有做过这一块的,以前都是只转发给一个目标,有多个目标时,如何处理?
...全文
836 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
BrillianceRen 2014-06-20
  • 打赏
  • 举报
回复
就live555里的socket管理而言, socket是放在一个列队里, 然后遍历列队发送数据的. 我想发送数据这种操作应是非常快的, 不要小看了它. 我觉得应该先不考虑时延, 预留扩展空间, 后期做测试, 如果确实有影响, 考虑是修改代码还是增加网卡.
akmm88 2014-06-20
  • 打赏
  • 举报
回复
参考下IOCP 的模型吧. 使用 TCP 比较快捷方便, UDP 要处理丢包比较麻烦的. 局域网发送速度一般都和很快的 WSASEND 数据包4K 100台客户机, 基本1MS就发完了
96掌门师兄 2014-06-19
  • 打赏
  • 举报
回复
引用 24 楼 oyljerry 的回复:
[quote=引用 23 楼 xiaoxiaoyu85 的回复:] [quote=引用 21 楼 china_jeffery 的回复:] 服务端主动发客户端,这个设计就有问题的,要是以后加了客户端岂不是还要改服务端?
这里就怕客户端上升的太多了,今天问了下老大,估计会有10个左右, 这样将想用的数据使用tcp send() 10遍,有点感觉怪怪的。[/quote] 10个客户端也太少了,可以放一个List,服务端遍历List,给各个客户端发送数据。就不用关心有具体多少客户端了,也不用动代码[/quote] 数据量比较大,每秒大概有10 * 50 次,如果再分发给10个客户端就是 10*50*10,怕延时大
oyljerry 2014-06-18
  • 打赏
  • 举报
回复
引用 23 楼 xiaoxiaoyu85 的回复:
[quote=引用 21 楼 china_jeffery 的回复:] 服务端主动发客户端,这个设计就有问题的,要是以后加了客户端岂不是还要改服务端?
这里就怕客户端上升的太多了,今天问了下老大,估计会有10个左右, 这样将想用的数据使用tcp send() 10遍,有点感觉怪怪的。[/quote] 10个客户端也太少了,可以放一个List,服务端遍历List,给各个客户端发送数据。就不用关心有具体多少客户端了,也不用动代码
96掌门师兄 2014-06-17
  • 打赏
  • 举报
回复
引用 21 楼 china_jeffery 的回复:
服务端主动发客户端,这个设计就有问题的,要是以后加了客户端岂不是还要改服务端?
这里就怕客户端上升的太多了,今天问了下老大,估计会有10个左右, 这样将想用的数据使用tcp send() 10遍,有点感觉怪怪的。
  • 打赏
  • 举报
回复
引用 21 楼 china_jeffery 的回复:
服务端主动发客户端,这个设计就有问题的,要是以后加了客户端岂不是还要改服务端?
这个设计没问题,增加客户端肯定是可以配置的 服务端只给配置的客户端发数据
china_jeffery 2014-06-15
  • 打赏
  • 举报
回复
服务端主动发客户端,这个设计就有问题的,要是以后加了客户端岂不是还要改服务端?
dvlinker 2014-06-14
  • 打赏
  • 举报
回复
这个要视情况而言,如果是广播给每个客户端,则可以广播;如果客户端需要登录,则可以通过已建立的链接来发
  • 打赏
  • 举报
回复
引用 17 楼 xiaoxiaoyu85 的回复:
[quote=引用 13 楼 dcmilan 的回复:] 我是做电力自动化的 我们电力行业的以太网103规约你可以参考 主站是建N个TCP server,每个server对应一个装置侧的TCP client 然后主站还有个udp广播来给每台装置对时 正常运行的时候是TCP client不断的去recv主站的数据 这时候我们用select模型,如果有数据就处理,没有就直接返回,不断循环 你参考这个模式吧,我们现场都是主站和从站N:M配置
恩,opcclient 这边肯定是recv()就可以了,但是服务器要同时发给多个client,怎么处理这个模型比较好呢?[/quote] 那就遍历着发呗
dibotiger 2014-06-13
  • 打赏
  • 举报
回复
主要看应用对数据可靠性的要求. 1.UDP的高效是有代价的. 那就不是完全可靠的. 如果你设计一个可靠的UDP, 那基本就是TCP了. 2.广播顾名思义, 只是一个通知型的网络协议, 即便是局域网, 也有可能出现丢包(比如网线接触不良等无法预知的网络故障). 3.如果数据完整可靠性很重要, 毫不犹豫TCP, 你所说的框架问题无非是你设计的TCP SERVER在处理事务方面细节. 多看些例子, 完全不是问题.
翅膀又硬了 2014-06-13
  • 打赏
  • 举报
回复
引用 11 楼 xiaoxiaoyu85 的回复:
[quote=引用 1 楼 yunchao630 的回复:] "当客户端较少的时候,这个时间不知道能不能忽略。"能忽略。
多谢回复了,一般1K的数据在多少ms时间级呢?[/quote]这些你还是多测测吧。应该用不了一毫秒
  • 打赏
  • 举报
回复
我是做电力自动化的 我们电力行业的以太网103规约你可以参考 主站是建N个TCP server,每个server对应一个装置侧的TCP client 然后主站还有个udp广播来给每台装置对时 正常运行的时候是TCP client不断的去recv主站的数据 这时候我们用select模型,如果有数据就处理,没有就直接返回,不断循环 你参考这个模式吧,我们现场都是主站和从站N:M配置
牧童吃五谷 2014-06-13
  • 打赏
  • 举报
回复
这个是OPC客户端的事,就是OPC客户端要不断定是读取OPC Server的数据,或者采用例外报告的方式,OPC Server和OPC客户端自己处理好的,一般不建议这么写重复的服务器发送数据给多个客户端的功能程序
96掌门师兄 2014-06-13
  • 打赏
  • 举报
回复
引用 1 楼 yunchao630 的回复:
"当客户端较少的时候,这个时间不知道能不能忽略。"能忽略。
多谢回复了,一般1K的数据在多少ms时间级呢?
96掌门师兄 2014-06-13
  • 打赏
  • 举报
回复
引用 9 楼 pingshell 的回复:
干嘛不用多线程呢? 如果数据允许丢失少量,可以用UDP组播 否则用TCP,开多线程处理。
多线程肯定是要用的,但是在线程里循环发送数据给多个客户端也是要时间的。这样我的线程就会阻塞在这里。 当然,再弄一个发送线程专门发也是可以的,但是那样线程就多了。 我现在想做的是在线程池的 某个线程里: recv(); //收某个PLC数据 sendAll(); //发送给所有的客户端 ,这里循环要时间. 之后如果有新数据来,再循环recv(); 现在我比较担心的是sendAll(),由于客户端较多,占用了很多时间。
pingshell 2014-06-13
  • 打赏
  • 举报
回复
干嘛不用多线程呢? 如果数据允许丢失少量,可以用UDP组播 否则用TCP,开多线程处理。
96掌门师兄 2014-06-13
  • 打赏
  • 举报
回复
顶起来,求帮助。。。。
96掌门师兄 2014-06-13
  • 打赏
  • 举报
回复
引用 12 楼 wwwfffhhh 的回复:
这个是OPC客户端的事,就是OPC客户端要不断定是读取OPC Server的数据,或者采用例外报告的方式,OPC Server和OPC客户端自己处理好的,一般不建议这么写重复的服务器发送数据给多个客户端的功能程序
这里客户端的数量应该是有限的。
96掌门师兄 2014-06-13
  • 打赏
  • 举报
回复
引用 13 楼 dcmilan 的回复:
我是做电力自动化的 我们电力行业的以太网103规约你可以参考 主站是建N个TCP server,每个server对应一个装置侧的TCP client 然后主站还有个udp广播来给每台装置对时 正常运行的时候是TCP client不断的去recv主站的数据 这时候我们用select模型,如果有数据就处理,没有就直接返回,不断循环 你参考这个模式吧,我们现场都是主站和从站N:M配置
恩,opcclient 这边肯定是recv()就可以了,但是服务器要同时发给多个client,怎么处理这个模型比较好呢?
96掌门师兄 2014-06-13
  • 打赏
  • 举报
回复
引用 12 楼 wwwfffhhh 的回复:
这个是OPC客户端的事,就是OPC客户端要不断定是读取OPC Server的数据,或者采用例外报告的方式,OPC Server和OPC客户端自己处理好的,一般不建议这么写重复的服务器发送数据给多个客户端的功能程序
恩,这里的问题就是如何把 同一个数据,怎么快速的分发给多个客户端。 这里的OpcClinet去读OpcServer的数据,现在一般是用DCOM通讯,我想把它改成TCP的,那么就要OpcServer发数据给OpcClient,这里怎么快速的发,是个问题。
加载更多回复(7)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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