組播通信
通信步驟:
組播發送:
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] = '\0'; printf("%s\n",buf1); close(socketfd);//、、、、、、、、5、關閉socket }