Multicast Sockets
来源:互联网 发布:网络黄金是什么 编辑:程序博客网 时间:2024/06/11 22:47
以下是在UNIX (FreeBSD)下进行多播编程需要注意的几点:
- 发送socket. 通常在发送端不需要做特别的处理,关键是只要发送到一个多播IP地址
要点:- 用 socket() 创建socket 带 AF_INET 和 SOCK_DGRAM 参数.
- 用 bind() 绑定到本地地址和端口.
- 不要用 connect() 去连接多播目的地址.
- 用 sendto() 发送数据.
- 接收socket. 接收除了要增加系统调用: setsockopt()以外,其它几乎和往常一样.
- 用 socket() 创建socket 带 AF_INET 和 SOCK_DGRAM 参数.
- 用 setsockopt() 带 IP_ADD_MEMBERSHIP 选项. 告诉系统接收目的地址是组播地址(自己发的除外)的网络包.
以下是C++写的一个例子:struct sockaddr_in sockaddr_group; struct hostent *group; struct ip_mreq mreq; bzero(&mreq,sizeof(struct ip_mreq)); // set group if ((group = gethostbyname(ghost))==(struct hostent *)0) { cerr << "gethostbyname error: fails for host " << host << endl; exit(-1); } struct in_addr ia; bcopy((void*)group->h_addr, (void*)&ia, group->h_length); bcopy(&ia, &mreq.imr_multiaddr.s_addr, sizeof(struct in_addr)); // set interface mreq.imr_interface.s_addr = htonl(INADDR_ANY); // do membership call if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreq)) == -1) { cerr << "error: setsockopt(IP_ADD_MEMBERSHIP) fails with errno " << errno << endl; exit(-1); }
- 用 bind() 绑定到本地地址和端口.
- 不要用 connect() 去连接多播目的地址.
- 用 recvfrom() 接收数据.
- 用 socket() 创建socket 带 AF_INET 和 SOCK_DGRAM 参数.
- 其它多播选项.
IP_MULTICAST_IF /* u_char; set/get IP multicast i/f */ IP_MULTICAST_TTL /* u_char; set/get IP multicast ttl */ IP_MULTICAST_LOOP /* u_char; set/get IP multicast loopback */ IP_ADD_MEMBERSHIP /* ip_mreq; add an IP group membership */ IP_DROP_MEMBERSHIP /* ip_mreq; drop an IP group membership */
用 IP_ADD_MEMBERSHIP 和 IP_DROP_MEMBERSHIP 切换接收socket监听的多播组. 如果发送端想同时接收一份发往多播组的拷贝设置 IP_MULTICAST_LOOP 选项
原文:http://www.cs.unc.edu/~jeffay/dirt/FAQ/comp249-001-F99/mcast-socket.html
0 0
- Multicast Sockets
- Working with Multicast Sockets
- MULTICAST
- sockets
- sockets
- Sockets
- Sockets
- MULTICAST && BROADCAST
- MultiCast 地址
- multicast tree
- Multicast notes
- Multicast-1
- sockets-network sockets (AFX_INET)
- Socket IP/UDP Multicast
- ACE-IPC(MULTICAST)
- broadcast multicast unicast 区别
- 组播,multicast
- multicast vs broadcast
- iOS逆向 dumpdecrypted
- HashCode方法
- Observed package id 'build-tools;XX.X.X' in inconsistent location
- Numpy 数组操作
- 解决com.mysql.jdbc.PacketTooBigException: Packet for query is too large问题
- Multicast Sockets
- 算法笔记(IX) 一个随机数生成问题
- Java UDP通信:DatagramSocket和DatagramPacket
- web.xml配置详解之filter
- Jenkins进阶系列之——09配置Linux系统ssh免密码登陆
- Golang--string操作
- Vijos P1975 扫雷游戏【谜题】
- popwindow最有效解决弹窗屏幕背景阴影和取消阴影
- 2017.05.09回顾 pandas使用记录