【网络编程】Linux多播简单实现
2016-06-05 17:26
246 查看
在测试多时先确定测试的接口(网卡)是否已经开启多播功能,如下:
![](http://img.blog.csdn.net/20160605172053433?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图.1
其中RUNNING MULTICAST表示开启了多播功能,可用ifconfig命令开启
多播数据发送端:
多播数据接受端:
图.1
其中RUNNING MULTICAST表示开启了多播功能,可用ifconfig命令开启
多播数据发送端:
#include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { if (argc != 3) { printf("Usage:./exec [multicast_ip] [port]\n"); exit(-1); } struct sockaddr_in servsend; socklen_t len = sizeof(struct sockaddr_in); int ret; int sendfd = socket(AF_INET, SOCK_DGRAM, 0); /* 目的地址为多播地址 */ servsend.sin_addr.s_addr = inet_addr(argv[1]); servsend.sin_port = htons(atoi(argv[2])); servsend.sin_family = AF_INET; u_char off = 1; /*开启外出数据包的回馈*/ setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &off, sizeof(off)); /* 选择多播外出接口 */ char buf[256]; struct in_addr in; in.s_addr = inet_addr("192.168.1.115"); setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_IF, &in, sizeof(in)); while (1) { sprintf(buf, "I am random [%d]", (int)random()%100); ret = sendto(sendfd, buf, strlen(buf), 0, (struct sockaddr *)&servsend, len); if (ret < 0) { printf("sendto error\n"); exit(-1); } sleep(2); } return 0; }
多播数据接受端:
#include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { if (argc != 3) { printf("Usage:./exec [multicast_ip] [port]\n"); exit(-1); } int ret; struct sockaddr_in servrecv; int len = sizeof(servrecv); int recvfd = socket(AF_INET, SOCK_DGRAM, 0); const int on = 1; ret = setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (ret < 0) { printf("setsockopt error\n"); exit(-1); } servrecv.sin_port = htons(atoi(argv[2])); servrecv.sin_addr.s_addr = htonl(INADDR_ANY); servrecv.sin_family = AF_INET; ret = bind(recvfd, (struct sockaddr *)&servrecv, len); if (ret < 0) { printf("bind error\n"); exit(-1); } /* 加入多播组 */ struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(argv[1]); mreq.imr_interface.s_addr = inet_addr("192.168.1.115"); ret = setsockopt(recvfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); if (ret < 0) { printf("setsockopt error(2)\n"); exit(-1); } struct sockaddr_in in; while (1) { char buf[256]; memset(buf, 0, 256); len = sizeof(in); ret = recvfrom(recvfd, buf, 256, 0, (struct sockaddr *)&in, &len); if (ret < 0) { printf("recvfrom error\n"); exit(-1); } printf("%s\n", buf); } return 0; }
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- 如何组织构建多文件 C 语言程序(二)
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程