linux c sockset之多播

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <netdb.h>  
  4. #include <string.h>  
  5. #include "Utility.h"  
  6. //多播发送者 使用例子 ./Sender 224.0.0.2 8888 hehe你好 5  
  7. int main(int argc, char** argv) {  
  8.     
  9.     if(argc<4||argc>5)  
  10.     {  
  11.         //接收多播地址和端口  
  12.         DieWithUserMessage("param","<multicast address> <port> <send string><TTL>");         
  13.     }  
  14.     char * multicastIPString=argv[1];  
  15.     char* service=argv[2];  
  16.     char* sendString=argv[3];  
  17.     size_t senStringLen=strlen(sendString);  
  18.     if(senStringLen>MAXSTRINGLENGTH)  
  19.     {  
  20.         DieWithUserMessage("string too long ",sendString);  
  21.     }  
  22.     //生命周期  
  23.     int multicastTTL=(argc==5)?atoi(argv[4]):1;  
  24.     //配置想要的地址结构  
  25.     struct addrinfo addr_criteria;  
  26.     memset(&addr_criteria,0,sizeof(addr_criteria));  
  27.     addr_criteria.ai_socktype=SOCK_DGRAM;  
  28.     addr_criteria.ai_family=AF_UNSPEC;  
  29.     addr_criteria.ai_protocol=IPPROTO_UDP; //  
  30.     addr_criteria.ai_flags |=AI_NUMERICHOST;  
  31.       
  32.     struct addrinfo*multicastAddr;  
  33.     //获取地址信息  
  34.     int ret=getaddrinfo(multicastIPString,service,&addr_criteria,&multicastAddr);  
  35.     if(ret!=0)  
  36.         DieWithUserMessage("getaddrinfo() failed!",gai_strerror(ret));  
  37.     //建立socket  
  38.     int sock=socket(multicastAddr->ai_family,multicastAddr->ai_socktype,multicastAddr->ai_protocol);  
  39.     if(sock<0)  
  40.         DieWithSystemMessage("socket() failed!");  
  41.     if(multicastAddr->ai_family==AF_INET6)  
  42.     {  
  43.         //如果是ip6,设置socket,允许发送多播和设置生命周期  
  44.         if(setsockopt(sock,IPPROTO_IPV6,IPV6_MULTICAST_HOPS,&multicastTTL,sizeof(multicastTTL))<0)  
  45.         {  
  46.             DieWithSystemMessage("setsockopt() failed!");  
  47.         }  
  48.     }else if(multicastAddr->ai_family=AF_INET)  
  49.     {  
  50.         //如果时ip4,设置socket,允许发送多播和设置生命周期  
  51.         u_char mcTTL=(u_char)multicastTTL;  
  52.         if(setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&mcTTL,sizeof(mcTTL))<0)  
  53.         {  
  54.             DieWithSystemMessage("setsockopt() failed!");  
  55.         }       
  56.     }else{  
  57.         DieWithUserMessage("unable to set TTL","invalid address family");  
  58.     }  
  59.     printf("multicastIPString:%s  service:%s  sendString:%s \n",multicastIPString,service,sendString);  
  60.     for(;;)  
  61.     {  
  62.         //循环发送数据  
  63.         ssize_t numBytes=sendto(sock,sendString,senStringLen,0,multicastAddr->ai_addr,multicastAddr->ai_addrlen);  
  64.         if(numBytes<0)  
  65.         {  
  66.             DieWithSystemMessage("sendto() failed!");  
  67.         }else if(numBytes!=senStringLen)  
  68.         {  
  69.             DieWithUserMessage("sendto()","sent unexpected number of bytes");  
  70.                       
  71.         }  
  72.         sleep(3);  
  73.     }  
  74.     return (EXIT_SUCCESS);  
  75. }  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <netdb.h>  
  4. #include <string.h>  
  5. #include "Utility.h"  
  6. //多播接收 使用例子 ./sender 224.0.0.2 8888 hehae 5  
  7. int main(int argc, char** argv) {  
  8.     //参数判断  
  9.     if (argc != 3)  
  10.         DieWithUserMessage("param""<multicast address> <port>");  
  11.     char * multicastAddrString = argv[1];  
  12.     char* service = argv[2];  
  13.     //配置想要的地址结构  
  14.     struct addrinfo addr_criteria;  
  15.     memset(&addr_criteria, 0, sizeof (addr_criteria));  
  16.     addr_criteria.ai_family = AF_UNSPEC;  
  17.     addr_criteria.ai_socktype = SOCK_DGRAM;  
  18.     addr_criteria.ai_protocol = IPPROTO_UDP;  
  19.     addr_criteria.ai_flags = AI_NUMERICHOST;  
  20.   
  21.     struct addrinfo *multicastAddr;  
  22.     //获取多播地址  
  23.     int ret = getaddrinfo(multicastAddrString, service, &addr_criteria, &multicastAddr);  
  24.     if (ret != 0)  
  25.         DieWithUserMessage("getaddrinfo() failed!", gai_strerror(ret));  
  26.     //建立sockset  
  27.     int sock = socket(multicastAddr->ai_family, multicastAddr->ai_socktype, multicastAddr->ai_protocol);  
  28.     if (sock < 0)  
  29.         DieWithSystemMessage("socket() failed!");  
  30.     //绑定端口  
  31.     if (bind(sock, multicastAddr->ai_addr, multicastAddr->ai_addrlen) < 0) {  
  32.         DieWithSystemMessage("bind() failed!");  
  33.     }  
  34.     if (multicastAddr->ai_family == AF_INET6) {  
  35.         //如果时IPV6,则加入IPV6多播组  
  36.         struct ipv6_mreq joinRequest;  
  37.         //拷贝  
  38.         memcpy(&joinRequest.ipv6mr_multiaddr, &((struct sockaddr_in6*) multicastAddr->ai_addr)->sin6_addr, sizeof (struct in6_addr));  
  39.         joinRequest.ipv6mr_interface = 0;  
  40.         puts("Joining ipv6 mulicast group..");  
  41.         //设置socket信息  
  42.         if (setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &joinRequest, sizeof (joinRequest)) < 0) {  
  43.             DieWithSystemMessage("setsockopt() failed!");  
  44.         }  
  45.     } else if (multicastAddr->ai_family == AF_INET) {  
  46.         //如果时ipv4,则加入多播组  
  47.         struct ip_mreq ip_joinRequest;  
  48.         ip_joinRequest.imr_multiaddr = ((struct sockaddr_in *) multicastAddr->ai_addr)->sin_addr;  
  49.         ip_joinRequest.imr_interface.s_addr = 0;  
  50.         printf("Joining ipv4 multicast group...\n");  
  51.         //设置socket信息   
  52.         if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ip_joinRequest, sizeof (ip_joinRequest)) < 0) {  
  53.             DieWithSystemMessage("setsockopt() failed!");  
  54.         }  
  55.     } else {  
  56.         DieWithSystemMessage("unknown address family!");  
  57.     }  
  58.     //清理  
  59.     freeaddrinfo(multicastAddr);  
  60.     char* recvString[MAXSTRINGLENGTH + 1];  
  61.     //接收数据  
  62.     int recvStringLen = recvfrom(sock, recvString, MAXSTRINGLENGTH, 0, NULL,0);  
  63.     if (recvStringLen < 0)  
  64.         DieWithSystemMessage("recvfrom() failed!");  
  65.     recvString[recvStringLen] = '\0';  
  66.     printf("Received:%s\n", recvString);  
  67.     close(sock);  
  68.     return (EXIT_SUCCESS);  
  69. }  



FROM: http://blog.csdn.net/earbao/article/details/16845127


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值