linux组播通讯

来源:互联网 发布:海康 知乎 编辑:程序博客网 时间:2024/04/27 01:15

/************linux 组播发送端**********/

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <stdlib.h>

int main(void)
{
  int sockfd;
  struct sockaddr_in baddr;
  int addr_len=sizeof(baddr);
  char buf[100];
  bzero(&baddr,sizeof(baddr));
  baddr.sin_family=AF_INET;
  baddr.sin_port=htons(9000);
  /**************D类广播地址不用bind函数*****************/
  /**************并且广播地址已经表明了是*************g广播性质所以不需要setsockopt函数/
  baddr.sin_addr.s_addr=inet_addr("224.10.10.10");

  if((sockfd= socket(AF_INET,SOCK_DGRAM,0))<0)
  {
    perror("socket:");
 exit(-1);
  }
  //bind(sockfd,(struct sockaddr*)&baddr,&addr_len);
  //int on=1;
 // setsockopt(sockfd,IPPROTO_IP,ADD_MEMBERSHIP,&on,sizeof(on));
  while(1)
  {
   fgets(buf,10,stdin);
      sendto(sockfd,buf,10,0,(struct sockaddr*)&baddr,sizeof(baddr));

  }
}

 

/************linux 组播接收端**********/


#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <stdlib.h>

int main(void)
{
  int sockfd;
  struct sockaddr_in baddr;
  struct sockaddr_in sendr;
  int addr_len=sizeof(baddr);
  char buf[100];
  /************************************/
  struct ip_mreq
  {
   /*********组播地址************************/
   struct in_addr imr_multiaddr;
  /**********本地IP**************************/ 
   struct in_addr imr_interface;
  };
  /******D类IP地址:组类广播地址********************/
   struct ip_mreq mreq;
   bzero(&mreq,sizeof(mreq));
  /*********组播地址通讯IP初始化***********发送端和接受端必须一致********/
   mreq.imr_multiaddr.s_addr=inet_addr("224.10.10.10");
  /***************本地组播通讯IP***********INADDR_ANY=0*****************************/
   /****************htonl(INADDR_ANY)等价于*htonl(0)***********************/  
   mreq.imr_interface.s_addr=htonl(INADDR_ANY);   
  if((sockfd= socket(AF_INET,SOCK_DGRAM,0))<0)
  {
    perror("socket:");
 exit(-1);
  }

  /***************sockfd 加入播组*********************************/
  int on=1;
  setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
  /******************初始化本地通讯*****IP 端口 类型***********/
  bzero(&baddr,sizeof(baddr));
 /************************************************/
  baddr.sin_family=AF_INET;
 /**************************通讯端口必须和发送端一致**********************/
  baddr.sin_port=htons(9000);
 /*********************************可以用通讯播组IP也可以用**0.0.0.0********/
  baddr.sin_addr.s_addr=inet_addr("224.10.10.10");//0.0.0.0
 /******************绑定通讯端口******************************/
 
  bind(sockfd,(struct sockaddr*)&baddr,addr_len);
  //  int on=1;
  //setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
  while(1)
  {
      //fgets(buf,10,stdin);
      recvfrom(sockfd,buf,10,0,(struct sockaddr*)&sendr,&addr_len);
      printf("%d\n",ntohs(sendr.sin_port));
  }
}