linux socket 如何发送分组广播

来源:互联网 发布:js正则表达式判断空格 编辑:程序博客网 时间:2024/06/05 20:10

    网上也看到了很多但感觉解释的不全面,在这里我也说一下我自己的摸索结果
下面还是先看一下代码 基本和网上搜到的一样

初始化
static struct sockaddr_in remote_addr;//远程地址
static struct sockaddr_in local_addr;//若本地要帮定端口要用

   memset(&remote_addr,0,sizeof(remote_addr));
   remote_addr.sin_family = AF_INET;
   remote_addr.sin_addr.s_addr = inet_addr("225.100.1.6");//广播地址
   remote_addr.sin_port = htons(6789); //目的端口

   memset(&local_addr,0,sizeof(local_addr));
   local_addr.sin_family = AF_INET;
   local_addr.sin_addr.s_addr =htonl(INADDR_ANY);
   local_addr.sin_port = htons(4321); //本地发送端口4321
 
 if( (sockfd=socket(AF_INET,SOCK_DGRAM,0))<0 )
 {
  BROADCAST_PRINT(( "can't open datagram socket rtn=%d/n", sockfd));
 }
 else
 {
   bind(sockfd,(struct sockaddr *)&local_addr,sizeof(local_addr) );
   //若要绑定本地端口加上这一句
 } 

发送语句
if(sendto(sockfd,data,cur_pkg_num,0,(struct sockaddr *)&remote_addr,sizeof(remote_addr))<0)
{}

代码是没有什么好说的了,下面说一下几个问题
1。仅仅凭上面代码发送返回肯定要失败的,应为还没有添加分组广播的路由
      在linux命令行中运行 route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0
2。还有就是看到一些人提到本地发送端口绑定的问题
     对于一次发送数据小于网络14xx(具体忘了)限制的包,用抓包程序可以看都没个包的端口
都是一样的,但包如果很大,系统会自动分包,一些抓包程序就会看到其他端口,但被拆的包
中一定有一个是指定的端口号的。具体为什么还没有搞懂,但对于上层程序应该不会出问题。

原创粉丝点击