组播通信
通信步骤:
组播发送:
1、 创建数据报套接字socket()
2、 接收方地址指定为组播地址(ip port)
3、 发送数据包sendto()
4、 关闭套接字close()
组播的接受:
1、 创建数据报套接字
2、 加入多播组
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interfacd;
};//头文件中已包含不需要定义
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr=inet_addr(“224.10.10.1”);
mreq.imr_interface.s_addr=htol(INADDR_ANY);
Setsockopt(sockfd,IPPROTO_IP,IP_ADDR_MEMBERSHIP,&mreq,sizeof(mreq));
3、 绑定本机ip和port bind()
4、 接受数据recvfrom()
组播代码范例: 服务器(发送数据) #include<stdio.h> #include<netinet/in.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include<pthread.h> #include<strings.h> int main() { int socketfd = socket(AF_INET,SOCK_DGRAM,0);//、、、1创建套接字socket struct sockaddr_in saddr; memset(&saddr,0,sizeof(saddr)); saddr.sin_family = AF_INET;//、、、、、、、2、指定发送地址,(为组播地址) saddr.sin_port = htons(6000); saddr.sin_addr.s_addr = inet_addr("230.1.1.1");//发送给组播ip char *buf = "hello"; sendto(socketfd,buf,strlen(buf),0,(struct sockaddr *)&saddr,s); //、、、、3、发送数据 close(socketfd); } 客户端(接受数据) #include<stdio.h> #include<netinet/in.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include<pthread.h> #include<strings.h> int main() { int socketfd = socket(AF_INET,SOCK_DGRAM,0);//、、、、、、、1、创建套接字socket struct sockaddr_in saddr; memset(&saddr,0,sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(6000); saddr.sin_addr.s_addr = htonl(INADDR_ANY); struct ip_mreq mreq; bzero(&mreq,sizeof(struct ip_mreq)); mreq.imr_multiaddr.s_addr = inet_addr("230.1.1.1");//组播的ip mreq.imr_interface.s_addr = htonl(INADDR_ANY); setsockopt(socketfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));//、、、2、加入多播组 int s = sizeof(struct sockaddr_in); bind(socketfd,(struct sockaddr *)&saddr,s);//、、、、3、绑定本机ip struct sockaddr_in caddr; char buf1[20]; int n; n = recvfrom(socketfd,buf1,20,0,(struct sockaddr *)&caddr,&s);//、、4、绑定本机ip buf1[n] = '