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

局域网里的服务器发送数据给客户端用什么协议比较好,UPD还是广播?
现在我有一个服务器OPCServer,负责实时收取PLC的数据,然后可以有多个OPCClient客户端连接到OPCServer,OPCServer收到数据后要将数据转发给所有的客户端,才用什么方式比较好呢?

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

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

没有做过这一块的,以前都是只转发给一个目标,有多个目标时,如何处理?
------解决方案--------------------
"当客户端较少的时候,这个时间不知道能不能忽略。"能忽略。
------解决方案--------------------
局域网里 这个需求 广播更合适
------解决方案--------------------
保存所有客户端,然后直接给客户端发送UDP等
------解决方案--------------------
 干嘛不用多线程呢?
如果数据允许丢失少量,可以用UDP组播
否则用TCP,开多线程处理。
------解决方案--------------------
这个是OPC客户端的事,就是OPC客户端要不断定是读取OPC Server的数据,或者采用例外报告的方式,OPC Server和OPC客户端自己处理好的,一般不建议这么写重复的服务器发送数据给多个客户端的功能程序
------解决方案--------------------
我是做电力自动化的
我们电力行业的以太网103规约你可以参考
主站是建N个TCP server,每个server对应一个装置侧的TCP client
然后主站还有个udp广播来给每台装置对时
正常运行的时候是TCP client不断的去recv主站的数据
这时候我们用select模型,如果有数据就处理,没有就直接返回,不断循环
你参考这个模式吧,我们现场都是主站和从站N:M配置
------解决方案--------------------
引用:
Quote: 引用:

"当客户端较少的时候,这个时间不知道能不能忽略。"能忽略。

多谢回复了,一般1K的数据在多少ms时间级呢?
这些你还是多测测吧。应该用不了一毫秒
------解决方案--------------------
主要看应用对数据可靠性的要求. 

1.UDP的高效是有代价的. 那就不是完全可靠的. 如果你设计一个可靠的UDP, 那基本就是TCP了. 

2.广播顾名思义, 只是一个通知型的网络协议, 即便是局域网, 也有可能出现丢包(比如网线接触不良等无法预知的网络故障). 

3.如果数据完整可靠性很重要, 毫不犹豫TCP, 你所说的框架问题无非是你设计的TCP SERVER在处理事务方面细节. 
多看些例子, 完全不是问题. 
------解决方案--------------------
引用:
Quote: 引用:

我是做电力自动化的
我们电力行业的以太网103规约你可以参考
主站是建N个TCP server,每个server对应一个装置侧的TCP client
然后主站还有个udp广播来给每台装置对时
正常运行的时候是TCP client不断的去recv主站的数据
这时候我们用select模型,如果有数据就处理,没有就直接返回,不断循环
你参考这个模式吧,我们现场都是主站和从站N:M配置

恩,opcclient 这边肯定是recv()就可以了,但是服务器要同时发给多个client,怎么处理这个模型比较好呢?

那就遍历着发呗
------解决方案--------------------
这个要视情况而言,如果是广播给每个客户端,则可以广播;如果客户端需要登录,则可以通过已建立的链接来发
------解决方案--------------------
服务端主动发客户端,这个设计就有问题的,要是以后加了客户端岂不是还要改服务端?
------解决方案--------------------
引用:
服务端主动发客户端,这个设计就有问题的,要是以后加了客户端岂不是还要改服务端?

这个设计没问题,增加客户端肯定是可以配置的
服务端只给配置的客户端发数据
------解决方案--------------------
引用:
Quote: 引用:

服务端主动发客户端,这个设计就有问题的,要是以后加了客户端岂不是还要改服务端?

这里就怕客户端上升的太多了,今天问了下老大,估计会有10个左右, 这样将想用的数据使用tcp send() 10遍,有点感觉怪怪的。

10个客户端也太少了,可以放一个List,服务端遍历List,给各个客户端发送数据。就不用关心有具体多少客户端了,也不用动代码
------解决方案--------------------
参考下IOCP 的模型吧.
使用 TCP 比较快捷方便, UDP 要处理丢包比较麻烦的.
局域网发送速度一般都和很快的 WSASEND 数据包4K 100台客户机,  基本1MS就发完了
------解决方案--------------------
就live555里的socket管理而言, socket是放在一个列队里, 然后遍历列队发送数据的.
我想发送数据这种操作应是非常快的, 不要小看了它.
我觉得应该先不考虑时延, 预留扩展空间, 后期做测试, 如果确实有影响, 考虑是修改代码还是增加网卡.