linux组播编程一个简单的例子

来源:互联网 发布:mac怎样彻底卸载软件 编辑:程序博客网 时间:2024/04/30 09:05

废话少说,直接上程序

接收端程序如下:

    #include <sys/types.h>      #include <sys/socket.h>      #include <netinet/in.h>      #include <arpa/inet.h>      #include <time.h>      #include <string.h>      #include <stdio.h>      #include <unistd.h>      #include <stdlib.h>      #define HELLO_PORT  1234    #define HELLO_GROUP "224.0.0.2"      #define MSGBUFSIZE 256    int main(int argc, char *argv[])      {          struct sockaddr_in addr;          int fd, nbytes,addrlen;          struct ip_mreq mreq;          char msgbuf[MSGBUFSIZE];                 int i=0;         u_int yes=1; /*** MODIFICATION TO ORIGINAL */          /* create what looks like an ordinary UDP socket */          if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)           {              perror("socket");              exit(1);          }          /**** MODIFICATION TO ORIGINAL */          /* allow multiple sockets to use the same PORT number */          if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)           {              perror("Reusing ADDR failed");              exit(1);          }          /*** END OF MODIFICATION TO ORIGINAL */          /* set up destination address */          memset(&addr,0,sizeof(addr));          addr.sin_family=AF_INET;          addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */          addr.sin_port=htons(HELLO_PORT);          /* bind to receive address */          if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)          {              perror("bind");              exit(1);          }          /* use setsockopt() to request that the kernel join a multicast group */          mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);          mreq.imr_interface.s_addr=htonl(INADDR_ANY);          if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)           {              perror("setsockopt");              exit(1);          }          /* now just enter a read-print loop */          while (1)           {              //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);              addrlen=sizeof(addr);              if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (socklen_t *)&addrlen)) < 0)               {                  perror("recvfrom");                  exit(1);              }            printf("nbytes=%d\n",nbytes);             puts(msgbuf);          }          return 0;      }     
//如果运行rcv程序的时候出现setopt:no device 执行下面语句即可
// route add -net 225.18.1.7 netmask 225.18.1.7 eth0     

发送端程序如下:

    #include <sys/types.h>      #include <sys/socket.h>      #include <netinet/in.h>      #include <arpa/inet.h>      #include <time.h>      #include <string.h>      #include <stdio.h>      #include <unistd.h>      #include <stdlib.h>      #define HELLO_PORT  1234    #define HELLO_GROUP "224.0.0.2"           int main(int argc, char *argv[])      {          struct sockaddr_in addr;          int fd, cnt;          struct ip_mreq mreq;          char *message="Hello, World!";          /* create what looks like an ordinary UDP socket */          if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)           {              perror("socket");              exit(1);          }          /* set up destination address */          memset(&addr,0,sizeof(addr));          addr.sin_family=AF_INET;          addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);          addr.sin_port=htons(HELLO_PORT);          /* now just sendto() our destination! */          while (1)          {              if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)               {                  perror("sendto");                  exit(1);              }              sleep(1);          }          return 0;      }  



0 0
原创粉丝点击