SylixOS组播使用

1. 概述

本文主要介绍如何在SylixOS上使用组播功能。

2. SylixOS组播设置

组播传输,即在发送者和每一接收者之间实现点对多点网络连接通信。正常大家会参考Linux使用组播的方法:把本机加入组播地址,即本机网卡作为组播成员,只有加入组才能收到组播消息。通过setsockopt设置加入组播,这样便可以接收组播信息。Linux参考代码如程序清单 2.1和程序清单 2.2所示。

程序清单 2.1  mcastserver


#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <netdb.h>

#include <errno.h>

#define BUFLEN 255

int main(int argc, char **argv)

{

struct   sockaddr_in  peeraddr;

struct   in_addr      ia;

int                     sockfd;

char                    recmsg[BUFLEN + 1];

unsigned int           socklen, n;

struct   hostent      *group;

struct   ip_mreq       mreq;

/*

* 创建 socket 用于UDP通讯

*/

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

if (sockfd < 0) {

printf("socket creating err in udptalk\n");

exit(1);

}

/*

* 设置要加入组播的地址

*/

bzero(&mreq, sizeof(struct ip_mreq));

if (argv[1]) {

if ((group = gethostbyname(argv[1])) == (struct hostent *) 0) {

perror("gethostbyname");

exit(errno);

}

} else {

printf(

"you should give me a group address,

224.0.0.0-239.255.255.255\n");

exit(errno);

}

bcopy((void *) group->h_addr, (void *) &ia, group->h_length);

/*

*  设置组地址

*/

bcopy(&ia, &mreq.imr_multiaddr.s_addr, sizeof(struct in_addr));

/*

* 设置发送组播消息的源主机的地址信息

*/

mreq.imr_interface.s_addr = htonl(INADDR_ANY);

/*

* 把本机加入组播地址,即本机网卡作为组播成员,只有加入组才能收到组播消息

*/

if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,

sizeof(struct ip_mreq)) == -1) {

perror("setsockopt");

exit(-1);

}

socklen = sizeof(struct sockaddr_in);

memset(&peeraddr, 0, socklen);

peeraddr.sin_family = AF_INET;

if (argv[2]) {

peeraddr.sin_port = htons(atoi(argv[2]));

}

else {

peeraddr.sin_port = htons(7838);

}

if (argv[1]) {

if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {

printf("Wrong dest IP address!\n");

exit(0);

}

} else {

printf("no group address given, 224.0.0.0-239.255.255.255\n");

exit(errno);

}

/*

* 绑定自己的端口和IP信息到socket上

*/

if (bind(sockfd, (struct sockaddr *) &peeraddr, sizeof(struct sockaddr_in)) == -1) {

printf("Bind error\n");

exit(0);

}

/*

* 循环接收网络上来的组播消息

*/

for (;;) {

bzero(recmsg, BUFLEN + 1);

n = recvfrom(sockfd, recmsg, BUFLEN, 0, (struct sockaddr *) &peeraddr,

&socklen);

if (n < 0) {

printf("recvfrom err in udptalk!\n");

exit(4);

} else {

/*

* 成功接收到数据

*/

recmsg[n] = 0;

printf("peer:%s", recmsg);

}

}

return 0;

}

程序清单 2.2  mcastclient


#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define BUFLEN 255

int main(int argc, char **argv)

{

struct sockaddr_in peeraddr, myaddr;

int sockfd;

char recmsg[BUFLEN + 1];

unsigned int socklen;

/*

* 创建 socket 用于UDP通讯

*/

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

if (sockfd < 0) {

printf("socket creating error\n");

exit(1);

}

socklen = sizeof(struct sockaddr_in);

/*

* 设置对方的端口和IP信息

*/

memset(&peeraddr, 0, socklen);

peeraddr.sin_family = AF_INET;

if (argv[2]) {

peeraddr.sin_port = htons(atoi(argv[2]));

} else {

peeraddr.sin_port = htons(7838);

}

if (argv[1]) {

/*

* 注意这里设置的对方地址是指组播地址,而不是对方的实际IP地址

*/

if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {

printf("wrong group address!\n");

exit(0);

}

} else {

printf("no group address!\n");

exit(0);

}

/*

* 设置自己的端口和IP信息

*/

memset(&myaddr, 0, socklen);

myaddr.sin_family = AF_INET;

if (argv[4]) {

myaddr.sin_port = htons(atoi(argv[4]));

} else {

myaddr.sin_port = htons(23456);

}

if (argv[3]) {

if (inet_pton(AF_INET, argv[3], &myaddr.sin_addr) <= 0) {

printf("self ip address error!\n");

exit(0);

}

} else

myaddr.sin_addr.s_addr = INADDR_ANY;

/*

* 绑定自己的端口和IP信息到socket上

*/

if (bind(sockfd, (struct sockaddr *) &myaddr, sizeof(struct sockaddr_in))

== -1) {

printf("Bind error\n");

exit(0);

}

/*

* 循环接受用户输入的消息发送组播消息

*/

for (;;) {

/*

* 接受用户输入

*/

bzero(recmsg, BUFLEN + 1);

if (fgets(recmsg, BUFLEN, stdin) == (char *) EOF) {

exit(0);

}

/*

* 发送消息

*/

if (sendto(sockfd, recmsg, strlen(recmsg), 0,(struct sockaddr *)

&peeraddr, sizeof(struct sockaddr_in))< 0) {

printf("sendto error!\n");

exit(3);

}

printf("'%s' send ok\n", recmsg);

}

return 0;

}

把Linux的组播程序移植到SylixOS上编译,导入运行SylixOS的板卡上,运行结果如图 2.1所示。

图 2.1  组播运行结果

根据图 2.1所示mcastclient组播信息没有被mcastserver接收到,而该测试代码在Linux上运行正常。经过分析发现Linux在网络协议栈中默认打开IP_MULTICAST_LOOP,即允许组播进行本地回环通信,而SylixOS的网络协议栈默认没有打开该选项。所以在SylixOS的组播代码中添加使用setsockopt设置IP_MULTICAST_LOOP,即允许组播本地回环的选项。在mcastclient程序中添加代码如程序清单 2.3所示。

程序清单 2.3  setsockopt设置


int loop = 1;

if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) == -1) {

perror("setsockopt");

exit(-1);

}

重新编译mcastclient上传运行,结果如图 2.2所示。

图 2.2  组播运行正常

3. 参考资料

《RealEvo-IDE使用手册》

时间: 2024-10-19 17:07:11

SylixOS组播使用的相关文章

java组播MulticastSocket

在单播模式中有服务器端和客户端之分,而组播模式与单播模式不同,每个端都是以路由器或交换机做为中转广播站,任意一端向路由器或交换机发送消息,路由或交换机负责发送其他节点,每个节点都是同等的.所以在编程模式上用同一个类表示即可--MulticastSocket. MulticastSocket属于jdk提供的类,类路径为java.net.MulticastSocket,利用此类可以很方便地实现组播功能,下面展示一个简单例子,两个节点之间通过组播传输消息. ①节点一,指定组播地址为228.0.0.4,

单播、多播(组播)和广播的区别

单播.多播和广播单播"(Unicast)."多播"(Multicast)和"广播"(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语.那么这些术语究竟是什么意思?区别何在? 1.单播:网络节点之间的通信就好像是人们之间的对话一样.如果一个人对另外一个人说话,那么用网络技术的术语来描述就是"单播",此时信息的接收和传递只在两个节点之间进行.单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一

学习组播原理笔记

广播的缺点:被路由隔离.不可跨网段.浪费流量和硬件资源OSPF建立邻居:单播:太麻烦  广播:浪费资源  组播:IGP 组播的优势:1.组的概念2.发送数据合理利用带宽资源.减少发送者的CPU资源消耗3.不知道接收者的地址4.实时性 基于UDP(数据层面)TCP  头部20Byte  重传机制 UDP  头部8Byte       1.速度快RTP实时传输协议:UDP报文是无序.通过RTP来控制UDP的无序性 多播协议:PIM(协议无关的多播)组播地址:224.0.0.13发送hello包的组播

UDP 组播/多播实现步骤

UDP组播 实现服务器对客户端分组播放(发送数据). 实现步骤: server.c 1.创建服务器套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);   返回套接字 2.构建服务器地址结构 struct sockaddr_in serveraddr; #include <strings.h> bzero(&server

组播实验

说明:做组播实验需要安装VLC Media Player 实验步骤: 步骤一:按照实验拓扑搭建实验环境 步骤二:配置SERVER 步骤三:配置AR1 <AR1>sys Enter system view, return user view with Ctrl+Z. [AR1]multicast routing-enable [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 1.1.1.2 255.255.255.252 May  2 2016 1

Android开发:组播(多播)与广播

近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下: 一.组播(多播)背景知识:组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IPv4中组播地址范围为224.0.0.0到239.255.255.255.JAVA编程:java中通过MulticastSoc

[转]IP_ADD_MEMBERSHIP : 组播错误 的解决方法:

http://www.cnitblog.com/dvb-dvb/archive/2012/10/15/aa.html by default live library includes winsock.h through windows.h instead of winsock2.h, but requires Winsock 2 in  initializeWinsockIfNecessary(...) function.IP_ADD_MEMBERSHIP value for Winsock1

4高并发服务器:UDP局域网服务器(组播)

 1 UDP局域网服务器 A读出每一个客户端发送过来的数据包,然后fork出子进程,由子进程去处理客户端请求. B客户端与服务器段交换多个数据报,服务器为每一个客户端连接创建新的socket,在其上bind一个临时端口,然后用该socket处理对应客户端上的所有应答,这个办法要求在客户查看服务器第一个应答中的源端口号.然后后面利用此端口号和服务器进行交互. 2函数声明 int bind(int sockfd, const struct sockaddr*addr,socklen_t addr

网络通信:单播、广播、组播

本文目录: 一.网络通信的分类.他们的定义和特点. 二.单播.广播.组播的传输信息的网络拓扑模型. 三.单播.广播.组播的编程实例. 一.网络通信的分类.他们的定义和特点. 二.单播.广播.组播的传输信息的网络拓扑模型. (一)单播 如图8-1 所示,网络中存在信息发送者Source,UserA 和UserC 提出信息需求,网络采用单播方式传输信息.                                                  单播传输特点归纳如下: * Source 向每个