有关UDP在局域网内多播的问题,欢迎参与讨论。

wpmsoft 2003-10-15 05:27:52
各位大侠:

想要实现局域网内的多播问题,看了一些资料,头晕脑胀,还是大家帮帮我吧。

环境及要求如下:一台服务器,负责采集实时视频数据以及监听来于客户端的呼叫请求;收到请求后,将数据打包后发送到该客户 。

我现在的进展情况:服务器创建一个SOCKET,并开始监听线程。每当收到一个请求时,便可以得到该客户的地址,OK,将此地址记录在案,以备后用。在另一个线程中实现数据的发送,发送时检查地址本,如果有多个地址存在,即表示同时有多个客户在请求,OK,用UDP的SENDTO开始发送,有多个地址,就发送多次!!!!!! (笨呀)

客户端同样创建SOCKET,用于监听接收来自于服务器的数据,当然服务器的IP地址以及PORT端口是已知的。

问题:这样子显示是不可行的。如果有10个,20个客户同时请求,需发送20次,速度上根本将达不到!!!! 所以, 应该采用多播的方案。

看看了资料,看到了加入多播组的内容,可是还是不太明白。

1 服务器加入组后,需要发送的时候只需要向这个组发送一次就可以了。然后,这个多播组就可以将数据发送到其它客户端上? 我想实现多播(即播放到指定的一个或多个客户端),而不是广播(播放到所有客户端)呀!!

2 如果服务器想要向指定的某一个客户端发送命令消息或专用数据,该如何做?

3 客户端向服务器发送该如何实现?是发到服务器还是多播组呀?

4 客户端原来是在监听服务器的指定端口。改用多播方案后,它应该从什么地方接收数据呢?

........................

欢迎参与讨论,助菜鸟早日解除迷团,不胜感激!
...全文
379 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
estevento 2004-03-22
  • 打赏
  • 举报
回复
up
wpmsoft 2003-10-17
  • 打赏
  • 举报
回复
我的邮件地址是:Payment.wu@Tom.com
wpmsoft 2003-10-17
  • 打赏
  • 举报
回复
哪位老大可以给个示例代码呀?急死了,通不过。

我是这样子做的:
发送端:
1 创建SOCKET,BIND到本地的IP地址,端口1600。
2 用SENDTO发送数据包到多播的IP地址234.5。6.7,端口1700。

接收端:
1 创建SOCKET,BIND到本地的IP地址,端口1800。
2 加入多播组,多播的IP是234.5.6.7。
3 设置多播的生命期TTF=1
4 用RECVFROM监听来到的数据:IP是234.5.6.7,端口是1700。

????????????????????
danfeng 2003-10-16
  • 打赏
  • 举报
回复
客户端的数据不应该发给服务器了 服务器作为有根式多播的根节点 他的作用应该只限于多播组的建立和叶节点的加入。
客户端的数据直接发往多播组就够了.
另外 我不大明白楼上 小西瓜的意思
"看看tcp的资料,要知道,多播的地址是224开头的."
~~~~ 多播是基于udp的
dahai_2002 2003-10-16
  • 打赏
  • 举报
回复
--------------------------------------------------------------------------
danfeng(丹枫)
服务器作为有根式多播的根节点 他的作用应该只限于多播组的建立和叶节点的加入。
--------------------------------------------------------------------------
不错组播是有两种方式:有根和无根。
但注意,IP多播只支持无根的,ATM才支持有根的。
因此,你要看看你的网络是ATM仿真局域网还是以其它基于IP的局域网,再决定用有根还是无根的。
如果是有根的那么根的数据可以发给所有叶子,而叶子所发送的数据只能传送给根(这是我们一般所希望的);如果是无根的那么根的数据可以发给所有叶子,叶子所发送的数据不仅只有根收到,其它叶子也能收到(IP组播就是这样,目前大部分组播也属于这一类)。
wpmsoft 2003-10-16
  • 打赏
  • 举报
回复
谢谢位大侠的大力相助,我已基本明白了多播的原理与方法。下一步我要快速地实践一下。

帖子暂时先不结,再挂上一天吧,多听听高手的意见。

再次谢谢大家。
bb123456789 2003-10-16
  • 打赏
  • 举报
回复
感兴趣!
danfeng 2003-10-16
  • 打赏
  • 举报
回复
没错 楼上正解
hdqqq 2003-10-15
  • 打赏
  • 举报
回复
多播的客户端应该是不用连接服务端的,只要在自己的系统中,绑定到某个端口读数据就可以了.
hdqqq 2003-10-15
  • 打赏
  • 举报
回复
1. 建议你去找一些多播的代码看看,有个范例会好很多,或者你留个mail,我发几个给你,都是从网上下载的.

2. 看看tcp的资料,要知道,多播的地址是224开头的.
bulesnow 2003-10-15
  • 打赏
  • 举报
回复
4 客户端原来是在监听服务器的指定端口。改用多播方案后,它应该从什么地方接收数据呢?
从多播地址接收数据。
你需要再建立一个udp的socket,并把该socket加入多播组,用WSARecvFrom()从多播地址接收数据即可。
bulesnow 2003-10-15
  • 打赏
  • 举报
回复
楼主,我也是做视频监控的。跟你的情况差不多,欢迎多交流!
我也用到了多播和多线程。关于多播danfeng(丹枫)已经说得很清楚了:)
我来回答你以下的问题:
2 如果服务器想要向指定的某一个客户端发送命令消息或专用数据,该如何做?
利用你服务器原来的socket发送即可。
3 客户端向服务器发送该如何实现?是发到服务器还是多播组呀?
发送到服务器。
4 客户端原来是在监听服务器的指定端口。改用多播方案后,它应该从什么地方接收数据呢?
从多播地址接收数据。
danfeng 2003-10-15
  • 打赏
  • 举报
回复
在有根的多播方式中,需要有一个控制根的存在,他负责多播组的建立和叶节点的加入。
另外,同一个多播组中只能有一个根节点的存在
danfeng 2003-10-15
  • 打赏
  • 举报
回复
第一,你原来所说的方案是可行的,我目前就是这么做的,而且你用的是udp,我还用的还是tcp的,因为不管你是用的一个数据包发给所有的客户端socket,还是多个线程,每个线程对应一个客户端socket发送,在底层传输上是一样的。
第二,关于多播的问题。多播的原理是数据发送到一个D类的地址上,需要接受数据的客户端只要加入这个多播组,就可以收到数据,而不加入这个多播组的客户端则不受影响(这也正是多播与广播的区别)。多播有2种方式,有根的和无根的,也就是是否需要多播服务器的差别,我不大清楚有根方式的。单对于无根方式来说,服务器是可以不需要的,所有的客户端的地位均是相同的,他们都可以把自己的数据发向多播层,当然要加上自己的识别标志。接受数据的时候只需要加入多播组,然后从多播地址上收取数据,再根据不同的标志来区分不同客户端发送的数据做不同的处理即可。
studyingpersons 2003-10-15
  • 打赏
  • 举报
回复
我也想学!!!

18,356

社区成员

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

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