在TX2嵌入式开发板上(Ubuntu操作系统)编写网络组播发送接收程序,首先了解一下组播.

linux多播编程

linux多播编程步骤:

1>建立一个socket;

2>设置多播的参数,例如超时时间TTL,本地回环许可LOOP等

3>加入多播组

的4>发送和接收数据

5>从多播组离开

多播程序设计使用setsockopt()函数和getsockopt()函数来实现,组播的选项是IP层的。

getsockopt()/setsockopt()的选项

含    义

IP_MULTICAST_TTL

设置多播组数据的TTL值

IP_ADD_MEMBERSHIP

在指定接口上加入组播组

IP_DROP_MEMBERSHIP

退出组播组

IP_MULTICAST_IF

获取默认接口或设置接口

IP_MULTICAST_LOOP

禁止组播数据回送

1.选项IP_MULTICASE_TTL

选项IP_MULTICAST_TTL允许设置超时TTL,范围为0~255之间的任何值,例如:

unsigned char ttl=255;

setsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));

2.选项IP_MULTICAST_IF

选项IP_MULTICAST_IF用于设置组播的默认默认网络接口,会从给定的网络接口发送,另一个网络接口会忽略此数据。例如:

struct in_addr addr;

setsockopt(s,IPPROTO_IP,IP_MULTICAST_IF,&addr,sizeof(addr));

参数addr是希望多播输出接口的IP地址,使用INADDR_ANY地址回送到默认接口。

默认情况下,当本机发送组播数据到某个网络接口时,在IP层,数据会回送到本地的回环接口,选项IP_MULTICAST_LOOP用于控制数据是否回送到本地的回环接口。例如:

unsigned char loop;

setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));参数loop设置为0禁止回送,设置为1允许回送。

3.选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBERSHIP

加入或者退出一个多播组,通过选项IP_ADD_MEMBERSHIP和IP_DROP_MEMBER- SHIP,对一个结构struct ip_mreq类型的变量进行控制,struct ip_mreq原型如下:

struct ip_mreq

{

struct in_addr imn_multiaddr;      /*加入或者退出的广播组IP地址*/

struct in_addr imr_interface;      /*加入或者退出的网络接口IP地址*/

};

选项IP_ADD_MEMBERSHIP用于加入某个多播组,之后就可以向这个多播组发送数据或者从多播组接收数据。此选项的值为mreq结构,成员imn_multiaddr是需要加入的多播组IP地址,成员imr_interface是本机需要加入广播组的网络接口IP地址。例如:

struct ip_mreq mreq;

setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));

但是实际测试使用过程中,有时候发送方不需要接收自己发送出去的信息,所以使用IP_MULTICAST_LOOP,但是没有工作,网络上搜索发现很多人都遇到了相同的问题,众说纷纭,有的说发送和接收使用相同的socket,发现下面这种说法更加靠谱.

Note  The Winsock version of the IP_MULTICAST_LOOP option is semantically different than the UNIX version of the IP_MULTICAST_LOOP option:

In Winsock, the IP_MULTICAST_LOOP option applies only to the receive path.

In the UNIX version, the IP_MULTICAST_LOOP option applies to the send path.

For example, applications ON and OFF (which are easier to track than X and Y) join the same group on the same interface; application ON sets the IP_MULTICAST_LOOP option on, application OFF sets the IP_MULTICAST_LOOP option off. If ON and OFF are Winsock applications, OFF can send to ON, but ON cannot sent to OFF. In contrast, if ON and OFF are UNIX applications, ON can send to OFF, but OFF cannot send to ON.

在windows平台,  IP_MULTICAST_LOOP 应用到接收端.在接收端启用IP_MULTICAST_LOOP. loop设置为1,表示接收自身发送出去的数据,设置为0表示不接收

在Linux平台,  IP_MULTICAST_LOOP 应用到发送端.下面是实际的部分测试代码

int ret = -1;

int loop = 1;

struct timeval timeout = {1,0};

client_fd = socket(AF_INET, SOCK_DGRAM, 0);

if(client_fd == -1)

{

Log_error("sock error \n");

return -1;

}

/*��ʼ����ַ*/

local_addr.sin_family = AF_INET;

local_addr.sin_addr.s_addr = htonl(INADDR_ANY);

local_addr.sin_port = htons(iPort);

/*��socket*/

ret=bind(client_fd,(struct sockaddr*)&local_addr,sizeof(local_addr));

if(ret < 0)

{

close(client_fd);

client_fd = -1;

Log_error("bind error \n");

return -2;

}

ret=setsockopt(client_fd,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));

if(ret < 0)

{

close(client_fd);

client_fd = -1;

Log_error("set sock error \n");

return -3;

}

m_mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR);//�㲥��ַ

m_mreq.imr_interface.s_addr = htonl(INADDR_ANY); //����ӿ�ΪĬ��?

/*���������㲥��*/

ret = setsockopt(client_fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&m_mreq,sizeof(m_mreq));

if(ret < 0)

{

close(client_fd);

client_fd = -1;

Log_error("set sock error \n");

return -4;

}

setsockopt(client_fd,SOL_SOCKET,SO_RCVTIMEO, (char *)&timeout,sizeof(struct timeval));

//�����߳�

g_thrUDPReadHdl.iInterval = iInterval;

int iRet = 0;

iRet = iPthreadCreate(&g_thrUDPReadHdl,

vpMCProcThread,

PTHREAD_PRI_MAX,

TSK_STACK_SIZE,

&g_thrUDPReadHdl);

if (0 != iRet)

{

Log_error("Create UDP data thread failed.\n");

close(client_fd);

client_fd = -1;

return -1;

}

嵌入式linux局域网组播发不了,组播 IP_MULTICAST_LOOP回环在Linux和Windows的差异相关推荐

  1. linux 增加回环设备,linux命令练习:mount fdisk swap dd创建本地回环设备

    练习一 1.创建一个1G的分区,文件系统为ext4,卷标为MYDATA,块大小为1024,预留管理空间为磁盘 分区的3%,要求开机后制动挂载至/data目录,并且自动挂载的设备要使用卷标进行引用. f ...

  2. linux回环网卡,Linux回环网卡驱动设计

    回环网卡驱动 1.回环网卡和普通网卡的区别是他是虚拟的不是实际的物理网卡,它相当于把普通网卡的发送端和接收端短接在一起. 2.在内核源代码里的回环网卡程序(drivers/net/loopback.c ...

  3. Linux组播编程 组播发送和组播接收

    接收端 int init_recv_socket(int *pSockfd) {int recv_sockfd = -1;struct ip_mreq mreq;bzero(&mreq, si ...

  4. 【Linux网络编程】多播、组播

    概述 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情况下,经常需要对一组特 ...

  5. 解决Linux 无法使用userdel 删除用户和组的问题

    解决Linux 无法使用userdel 删除用户和组的问题 系统环境 #cat /etc/redhat-release CentOS release 6.7 (Final) #getenforce D ...

  6. linux初级学习笔记七:linux用户管理,密码和组命令详解!(视频序号:04_1)

    本节学习的命令: 用户管理命令:useradd,userdel,id,finger,usermod,chsh,chfn,passwd,pwck, 组管理命令:groupadd,groupmod,gro ...

  7. Linux学习之用户管理和组管理

    一.Linux系统上用户和用户组类别 用户类别 1.管理员 uid=0 2.普通用户 id:1~65535 2.1.系统用户 id:1~499,一般不允许登陆系统 2.2.一般用户 id:500~60 ...

  8. 鸟哥linux群,【鸟哥的linux私房菜-学习笔记】linux的帐号与群组

    linux的帐号与群组 使用者标识符: UID 与 GID ID 与账号的对应就在 /etc/passwd 当中: 计算机只认得ID(即数字),并不能区别账号: 每个登陆的使用者至少都会取得两个 ID ...

  9. linux中的用户、群组和权限

    linux中的用户.群组和权限  linux中的用户.群组和权限 新建用户natasha,uid为1000,gid为555,备注信息为"master" groupadd -g 55 ...

最新文章

  1. HTML POST提交参数给PHP并返回json,上传execl文件
  2. 易点租加速电脑租赁市场布局
  3. 将一张100元的钞票换成1元、5元和10元的钞票,每种钞票至少一张,编写程序输出所有的换法,循环次数需要尽可能地少。
  4. R语言KMeans聚类分析确定最优聚类簇数实战:NbClust包(确定最优聚类簇数)
  5. Android热修复升级探索——SO库修复方案 1
  6. HDU Problem - 4289 Control(最大流)
  7. 学习笔记之数据可视化(一)——项目适配方案
  8. GitHub+Vue自动化构建部署
  9. 问题:如何将多个文件里内容都提取出来
  10. 管道工程和这个管道铺设过程中的电缆卫士--电缆故障测试仪 电缆测距 故障定点 路径查找 电缆综合故障测试仪 FB11
  11. [0CTF 2016] piapiapia 题解
  12. 2023华为软件精英挑战赛——全赛段思路分享与总结
  13. win7自定义html为桌面,win7桌面属性设置_win7如何自定义桌面属性
  14. 如何获取QQ邮箱授权码——步骤详解
  15. pygal画世界地图
  16. ASM安装和sqlplus管理
  17. yolov3代码详解(七)
  18. 【题解】百度2020校招Web前端工程师笔试卷(第二批):单选题、多选题
  19. 解决NotImplementedError: Layer XX has arguments in `__init__` and therefore must override `get_config`
  20. 自适应变异麻雀搜索优化算法

热门文章

  1. .rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/rubygems/...:in `require':
  2. 奇偶校验位使用原理简单理解
  3. 只需一部手机,新手做自媒体不想出镜拍视频,推荐这4个领域
  4. 离开培训之地所学到的
  5. 两种常用的参考图像质量评价指标——超分辨率(五)
  6. 电脑重装与手机换机的工作备忘
  7. quartz 表结构、配置文件、实现说明
  8. Trimble RealWorks处理点云数据(二)之点云切割
  9. Echarts 折线图完全配置指南 - 手把手教你设置 Echarts 折线图详细教程
  10. C#基于Npoi通过特性的方式导出简单数据到Excel或基于特性以及基于Excel模板导出数据到Excel以及从Excel中把数据导入到对象中