(1)使用UDP传输协议
(2)使用多播地址(224.0.0.1-239.255.255.255)
(3)另外需要中间的所有路由器都需要支持多播协议才可以。
需要注意的一点:
在MSDN中关于setsockopt()函数有一个注意事项:
Note If the setsockopt function is called before the bind function, TCP/IP options will not be checked with TCP/IP until the bind occurs. In this case, the setsockopt function call will always succeed, but the bind function call can fail because of an early setsockopt failing.
如果setsockopt函数设定TCP/IP协议层的选项,则需要在bind函数之后调用才会有效;如果在设置TCP/IP选项的情况下,先调用setsockopt,然后再调用bind函数,则bind函数会提示出错!发送端:
发送方直接往多播地址发送信息就可以,该信息会由路由传送到对该多播信息感兴趣的端口(该端口加入了多播组)
1. 创建UDP套接字;
2.向多播地址发送信息;
注意:一般默认协议头部的TTL=1,即该多播信息只能在本地局域网中进行传输,如果需要发往更大的地址范围,可以调用setsockopt()函数修改IP协议的TTL选项
setsockopt(sendSock, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&nTTL, sizeof(int));
接收端:
接收端必须加入多播组才可以。这样路由才会知道该端口对某个多播组的消息感兴趣,从而把信息传输到该端点。
加入多播组是在IP协议层,即网络层进行设置的。
1.创建UDP套接字;
2.绑定接收地址;
注意:这里绑定的是本机的IP,端口是多播发送的端口。直接绑定多播IP肯定会失败的!
3.设置套接字的选项;
在C#中,有特定的MulticastOption类,用以加入多播组时使用,并将该类对象作为套接字选项的值传入。
(此时才用到多播组的IP)
具体为IP层协议(IPPROTO_IP)上的IP_ADD_MEMERSHIP(加入多播组)和IP_DROP_MEMBERSHIP(退出多播组)选项
注意:步骤2、3顺序不能反,否则在调用setsockopt()函数时会出错,出错信息为:WSAEINVAL
通过结构体ip_mreq(很好记,IP层,请求多播),例如(windows平台下)
ip_mreq mcast;
mcast.imr_interface.S_un.S_addr=INADDR_ANY;
mcast.imr_multiaddr.S_un.S_addr=inet_addr("234.5.6.7");