linux下如何开启multicastsocket创建UDP通信描述符后,setsockopt加入多播组,再bind绑定到该网卡上
//在指定的IP和端口上接收多播组的报文
intrecv_msg(char*ip, unsignedshortport ,char*mult_ip )
{
//建立通讯套接字
intfd = socket( PF_INET , SOCK_DGRAM , 0 );
if( -1 == fd )
{
perror("socket failed");
return-1;
}
//设置地址重用和接收多播
{
intreuse = 1 ;
structip_mreqnmult_addr = {0};
mult_addr.imr_multiaddr.s_addr = inet_addr( mult_ip );
mult_addr.imr_address.s_addr = inet_addr( ip );
if( -1 == setsockopt( fd , IPPROTO_IP , IP_ADD_MEMBERSHIP ,
mult_addr , sizeof(mult_addr)))
【Linux组播发包命令 linux发送广播包】{
perror("setsockopt add failed");
goto_out;
}
if( -1 == setsockopt( fd , SOL_SOCKET, SO_REUSEADDR,
reuse , sizeof(reuse) ) )
{
perror("setsockopt reuse failed");
}
}
//绑定地址和端口
{
structsockaddr_inaddr = {0};
addr.sin_family = PF_INET;
addr.sin_port = htons( port );
addr.sin_addr.s_addr = INADDR_ANY;
if( -1 == bind( fd , (struct sockaddr*)addr ,
sizeof(addr) ) )
{
perror("bind failed");
goto_out;
}
}
//接收信息
while(1)
{
charbuf[128] = {0};
intret= 0 ;
struct sockaddr_inclient_addr = {0};
intlen = sizeof(client_addr) ;
ret = recvfrom( fd , buf , sizeof(buf), 0 ,
(struct sockaddr*)client_addr ,
len );
//被信号中断则重启
if( (-1 == ret)(EINTR ==errno ))
{
continue;
}
else if( -1 ==ret )
{
perror("recvfrom failed");
goto_out;
}
else if( ret 0 )
{
printf("%s\n" , buf );
}
usleep( 100*1000 );
}
_out:
if( fd = 0)
{
close( fd );
}
return0;
}
linux下怎么指定网卡发包收包linux下有命令可直接执行抓包Linux组播发包命令的,命令如下Linux组播发包命令:
1、tcpdump -vv -i ethN -s 10240 -w /root/abc.cap host ip
2、上述命令中,ethN,是你要抓Linux组播发包命令的本机网卡,一般是eth0,可使用ifconfig查看使用的哪个网卡
-s 指定的是抓包数量-w指定的是抓到的包写到哪个位置host ip即为抓取哪个ip 的包
怎样用Linux实现组播路由转发这就要有PIM(Protocol Independent Multicast,协议无关组播组)协议的支持 , 就必须在Linux环境下安装Pimd软件协议包 。安装补丁文件 安装Pimd软件协议包需要两个补丁文件:pimkern-freebsd-4.6.patch和netstat-freebsd-4.6.patch 。安装步骤如下: 首先将两个补丁文件拷贝到/usr/src/目录下,并执行以下命令:#patch -p2netstat-freebsd-4.6.patch #patch -p2pimkern-freebsd-4.6.patch 执行以下命令,编译并安装netstat:#cd /usr/src/usr.bin/netstat #make #make install 重新编译内核 执行以下命令 , 修改multi配置文件:#cd /usr/src/sys/i386/conf/ #cp GENRIC multi #vi multi 在multi配置文件中 , 加入下列两行代码:options MROUTING options PIM 保存并退出vi编辑器 。在当前multi配置文件所在的目录执行以下命令:#config multi #cd /usr/src/sys/compile/multi/ #make depend #make #make install 至此,新内核编译完毕 。备份Kernel文件 新内核编译完毕后,在重新启动前,要先将根目录下原有的Kernel文件进行备份 。#cd / #mv kernel kernel.old 若提示“operation not permitted”,则需要先执行以下命令:#chflags noschg /kernel 备份Kernel文件后执行以下命令:#cp /usr/src/sys/compile/multi/kernel /kernel 在系统重新启动后,默认选择的便是新编译的内核 。安装Pimd软件协议包 Linux下Pimd软件协议包代码的起源有两个地方 , 一个是日本的KAME项目组,另一个是南加州大学信息科学学院 。到这两个组织的主页上都可以下载所需要的pimd-current.tar.gz 协议包和上面提到的两个补丁 。用以下命令解压缩 pimd-current.tar.gz 软件包,并安装:#tar zxf pimd-current.tar.gz #cd pimd-2.1.0-alpha29.16 #make #make install 以上命令执行过程中可能会出现错误,需要手工将其完成,拷贝当前目录下的pimd文件:#cp pimd /usr/local/bin/ #chmod 755 pimd #cp pimd.conf /etc/ 至此,Pimd软件协议包安装完毕 。还需要打开Linux系统的路由转发功能,才能实现组播包的转发,即在配置文件rc.conf中增加以下代码,重启后生效 。作者:龙宇翔 苑庆国
推荐阅读
- gis里如何删除面,arcgis怎么删除面里多余的面
- 少数民族拍摄的电影叫什么,少数民族电影导演
- 秦皇岛营销网站搭建优势,营销网站建设
- 家里新路由器怎么安装宽带,家里新路由器怎么安装宽带教程
- vb.net跳转页面 vbnet tabpage
- 如何开展宽带营销活动工作,如何开展宽带营销活动工作总结
- flutter横竖屏切换,flutter 旋转
- 在mysql中怎么删除表 mysql如何删除表
- 最强的奥特曼是什么视频,奥特曼里面最强的怪兽是什么怪兽