#include <stdio.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
char *host_name = "224.0.1.129";
int port = 6789;
int main(int argc, char **argv)
{
int socketfd;
struct sockaddr_in sin,sinclient;
struct ip_mreq command;
int loop = 1, iter = 0, sin_len;
struct hostent *server_host_name;
char message[256];
if ((server_host_name = gethostbyname(host_name)) == 0)
{
perror("gethostbyname");
exit(EXIT_FAILURE);
}
/*open socket*/
socketfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (-1 == socketfd)
{
perror("Opening socket");
exit(EXIT_FAILURE);
}
loop = 1;/*allow address reuse*/
if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &loop, sizeof(loop)) < 0)
{
perror("setsockopt: SO_REUSEADDR");
exit(EXIT_FAILURE);
}
/*bind socket*/
/*need INADDR_ANY to allow receipt of multi-cast and uni-cast messages*/
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(port);
if (bind(socketfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
perror("bind");
exit(EXIT_FAILURE);
}
loop = 1;
if (setsockopt(socketfd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) < 0)
{
perror("setsockopt: IP_MULTICAST_LOOP");
exit(EXIT_FAILURE);
}
command.imr_multiaddr.s_addr = inet_addr("224.0.1.129");
command.imr_interface.s_addr = inet_addr(argv[1]);
if (command.imr_multiaddr.s_addr == -1)
{
perror("224.0.1.129 not a legal multicast address.");
exit(EXIT_FAILURE);
}
if(setsockopt(socketfd,IPPROTO_IP,IP_MULTICAST_IF,&command.imr_interface.s_addr,sizeof(struct in_addr))<0)
{
perror("failed to enable multi-cast on the interface");
exit(EXIT_FAILURE);
}
if (setsockopt(socketfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &command, sizeof(struct ip_mreq)) < 0)
{
perror("setsockopt: IP ADD_MEMBERSHIP");
exit(EXIT_FAILURE);
}
/* if( setsockopt(socketfd, IPPROTO_IP, IP_MULTICAST_TTL, &loop, sizeof(int)) < 0)
{
perror("failed to set the multi-cast time-to-live");
exit(EXIT_FAILURE);
}*/
//starting Mcast transmit...
while(1)
{
sinclient.sin_family = AF_INET;
sinclient.sin_addr.s_addr = inet_addr("224.0.1.129");
sinclient.sin_port = htons(port);
if (sendto(socketfd, "test from broadcast", sizeof("test from broadcast"), 0,(struct sockaddr *)&sinclient, sizeof(sinclient)) < 0)
{
perror("sendto");
exit(EXIT_FAILURE);
}
sleep(2);
}
exit(EXIT_SUCCESS);
}
没有合适的资源?快使用搜索试试~ 我知道了~
linux多播程序(无需修改,可在x87平台和arm平台上面运行)
共3个文件
c:2个
makefile:1个
4星 · 超过85%的资源 需积分: 9 30 下载量 26 浏览量
2011-04-05
10:11:57
上传
评论
收藏 2KB RAR 举报
温馨提示
linux上面多播测试程序,无需修改,已经在x86平台和arm平台上面通过测试。程序代码风格良好,方便阅读。包括服务器程序、客户程序、和Makefile文件,下载后编译即可使用。如果是在arm平台上面运行,需要更改相应的arm-linux-gcc路径,如果有编译问题请阅读Makefile。
资源推荐
资源详情
资源评论
收起资源包目录
linuxMulticast.rar (3个子文件)
linuxMulticast
multicastserver.c 3KB
multicastclient.c 3KB
Makefile 324B
共 3 条
- 1
资源评论
- zhanghaoxdisn2013-05-26不错,很受用,谢谢!
- u0144583312015-06-28出现段错误,求改进
- pengpenggua2013-02-26X86编译后运行提示段错误
zheng23yi
- 粉丝: 2
- 资源: 43
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功