linux c socket之局域网广播

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <sys/time.h>  
  4. #include <unistd.h>  
  5. #include <stdbool.h>  
  6. #include <sys/socket.h>  
  7. #include <arpa/inet.h>  
  8. #include <string.h>  
  9. #include "Utility.h"  
  10. //局域网广播发送,配合该工具检测http://download.csdn.net/download/ben395575481/1796582  
  11. static const char * IN6ADDR_ALLNODES="FF02::1";//v6 addr  
  12. int main(int argc, char** argv) {  
  13.     //检测参数  
  14.     if(argc!=4)  
  15.         DieWithUserMessage("param","[4][6] <port> <string to send>");  
  16.     in_port_t port=htons((in_port_t)atoi(argv[2]));  
  17.     //配置地址结构  
  18.     struct sockaddr_storage destStoreage;  
  19.     memset(&destStoreage,0,sizeof(destStoreage));  
  20.       
  21.     size_t addr_size=0;  
  22.     if(argv[1][0]=='4')  
  23.     {  
  24.         //使用IP4  
  25.         struct sockaddr_in *destAddr4=(struct sockaddr_in*)&destStoreage;  
  26.         destAddr4->sin_family=AF_INET;  
  27.         destAddr4->sin_port=port;  
  28.         destAddr4->sin_addr.s_addr=INADDR_BROADCAST;//广播  
  29.         addr_size=sizeof(struct sockaddr_in);  
  30.     }else if(argv[1][0]=='6')  
  31.     {  
  32.         //使用IP6  
  33.         struct sockaddr_in6 *destAddr6=(struct sockaddr_in6*)&destStoreage;  
  34.         destAddr6->sin6_family=AF_INET6;  
  35.         destAddr6->sin6_port=port;  
  36.         inet_pton(AF_INET6,IN6ADDR_ALLNODES,&destAddr6->sin6_addr);  
  37.         addr_size=sizeof(struct sockaddr_in6);  
  38.     }else{  
  39.         DieWithUserMessage("Unknown address family",argv[1]);                 
  40.     }  
  41.     //转化为最后的地址  
  42.     struct sockaddr *destAddress=(struct sockaddr*)&destStoreage;  
  43.     size_t msg_len=strlen(argv[3]);  
  44.     if(msg_len>MAXSTRINGLENGTH)  
  45.     {  
  46.         DieWithUserMessage("string too long ",argv[3]);  
  47.     }  
  48.     //建立socket  
  49.     int sock=socket(destAddress->sa_family,SOCK_DGRAM,IPPROTO_UDP);  
  50.     if(sock<0)  
  51.         DieWithSystemMessage("socket() failed!");  
  52.     int broadcastPerm=1;  
  53.     //设置socket允许发送局域网广播  
  54.     if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&broadcastPerm,sizeof(broadcastPerm))<0)  
  55.     {  
  56.         DieWithSystemMessage("setsockopt() failed!");  
  57.     }  
  58.     int i=0;  
  59.     for(;;)  
  60.     {  
  61.         printf("send broadcast %d!\n",i++);  
  62.         //循环发送广播数据  
  63.         ssize_t numBytes=sendto(sock,argv[3],msg_len,0,destAddress,addr_size);  
  64.         if(numBytes<0)  
  65.             DieWithSystemMessage("sendto() failed!");  
  66.         else if(numBytes!=msg_len)  
  67.             DieWithUserMessage("sendto()","sent unexpected number of bytes");  
  68.         sleep(3);  
  69.     }  
  70.   
  71.     return (EXIT_SUCCESS);  
  72. }  



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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值