linux网络编程(组播)
来源:互联网 发布:2005至2008年网络歌曲 编辑:程序博客网 时间:2024/06/07 00:43
组播
1. 分组
每个D类IP地址就是一个组,组播实现原理:
接收 -- 加入一个组
发送 -- 向一个组(目标IP地址为组播地址)发送数据包
2. 组播地址(IP地址和网卡地址)
IP地址: D类地址 ,高位固定为1110,范围: 224.0.0.0-239.255.255.255
网卡地址: 前24bit固定为01-00-5e, 最后23bit是D类IP地址的后23bit直接映射下来 -- 仅仅正对于以太网
3. 接收流程
(1) 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
(2) 加入组
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(argv[1]); // "224.10.10.1"
mreq.imr_interface.s_addr = INADDR_ANY;
ret = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
(3) 绑定IP地址和端口
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip);
// addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
(4) 接收
struct sockaddr_in peer_addr;
socklen_t addrlen = sizeof(peer_addr);
ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&peer_addr, &addrlen);
(3) 关闭
close(sockfd);
4. 发送流程
(1) 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
(2) 发送
struct sockaddr_in muticast_addr;
bzero(&muticast_addr, sizeof(muticast_addr));
muticast_addr.sin_family = AF_INET;
muticast_addr.sin_port = htons(port);
muticast_addr.sin_addr.s_addr = inet_addr(一定填多播(224.10.10.1));
ret = sendto(sockfd, buf, len, 0, (struct sockaddr *)&broad_addr, sizeof(broad_addr));
(3) 关闭
二、接收端
1. 分组
每个D类IP地址就是一个组,组播实现原理:
接收 -- 加入一个组
发送 -- 向一个组(目标IP地址为组播地址)发送数据包
2. 组播地址(IP地址和网卡地址)
IP地址: D类地址 ,高位固定为1110,范围: 224.0.0.0-239.255.255.255
网卡地址: 前24bit固定为01-00-5e, 最后23bit是D类IP地址的后23bit直接映射下来 -- 仅仅正对于以太网
3. 接收流程
(1) 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
(2) 加入组
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(argv[1]); // "224.10.10.1"
mreq.imr_interface.s_addr = INADDR_ANY;
ret = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
(3) 绑定IP地址和端口
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(ip);
// addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
(4) 接收
struct sockaddr_in peer_addr;
socklen_t addrlen = sizeof(peer_addr);
ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&peer_addr, &addrlen);
(3) 关闭
close(sockfd);
4. 发送流程
(1) 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
(2) 发送
struct sockaddr_in muticast_addr;
bzero(&muticast_addr, sizeof(muticast_addr));
muticast_addr.sin_family = AF_INET;
muticast_addr.sin_port = htons(port);
muticast_addr.sin_addr.s_addr = inet_addr(一定填多播(224.10.10.1));
ret = sendto(sockfd, buf, len, 0, (struct sockaddr *)&broad_addr, sizeof(broad_addr));
(3) 关闭
close(sockfd);
组播(代码)
一、发送端
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <strings.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>// ./send 224.0.0.1 8888int main(int argc, const char *argv[]){int ret;int sockfd;char packet[1024];struct sockaddr_in muti_addr;if (argc < 3){fprintf(stderr, "Usage: %s <broadcast ip> <port>\n", argv[0]);exit(EXIT_FAILURE);}// 1. 创建报文套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("Fail to socket.");exit(EXIT_FAILURE);} // 2. 通过多播地址发送数据包到指定端口 bzero(&muti_addr, sizeof(muti_addr));muti_addr.sin_family = AF_INET;muti_addr.sin_port = htons(atoi(argv[2]));muti_addr.sin_addr.s_addr = inet_addr(argv[1]);while (1){putchar('\n');putchar('>');fgets(packet, sizeof(packet), stdin);packet[strlen(packet) - 1] = '\0';ret = sendto(sockfd, packet, strlen(packet), 0, (struct sockaddr *)&muti_addr, sizeof(muti_addr));if (-1 == ret){perror("Fail to sendto."); break;}if (strcmp(packet, "quit") == 0){break;}}// 3. 关闭套接字close(sockfd);return 0;}
二、接收端
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <strings.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>// ./recv 192.168.2.255 8888int main(int argc, const char *argv[]){int ret;int sockfd;char packet[1024];struct sockaddr_in addr; struct ip_mreq mreq;struct sockaddr_in peer_addr;socklen_t addrlen = sizeof(peer_addr);if (argc < 3){fprintf(stderr, "Usage: %s <broadcast ip> <port>\n", argv[0]);exit(EXIT_FAILURE);}// 1. 创建报文套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("Fail to socket.");exit(EXIT_FAILURE);}//加入组 mreq.imr_multiaddr.s_addr = inet_addr(argv[1]); mreq.imr_interface.s_addr = INADDR_ANY; ret = setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)); if(-1 == ret){ perror("fail to setsockopt"); exit(EXIT_FAILURE); }// 2. 绑定广播地址和端口bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(atoi(argv[2]));// broad_addr.sin_addr.s_addr = inet_addr(argv[1]);addr.sin_addr.s_addr = INADDR_ANY;ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));if (-1 == ret){perror("Fail to bind.");exit(EXIT_FAILURE);}while (1){// 3. 接收ret = recvfrom(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&peer_addr, &addrlen);if (-1 == ret){perror("Fail to recvfrom.");break;}packet[ret] = '\0';printf("---------------------------------------\n");printf("ip : %s\n", inet_ntoa(peer_addr.sin_addr));printf("port : %d\n", ntohs(peer_addr.sin_port));printf("recv(%d) : %s\n", ret, packet);printf("---------------------------------------\n");if (strcmp(packet, "quit") == 0){break;}}// 4. 关闭套接字close(sockfd);return 0;}
0 0
- linux网络编程之-----多播(组播)编程
- linux网络编程之-----多播(组播)编程
- linux网络编程之-----多播(组播)编程
- linux网络编程之-----多播(组播)编程
- linux网络编程之-----多播(组播)编程
- linux网络编程之一-----多播(组播)编程
- linux网络编程之-----多播(组播)编程
- linux网络编程之-----多播(组播)编程
- linux网络编程:多播(组播)编程
- linux网络编程(组播)
- 【Linux网络编程】多播、组播
- linux网络编程之-----多播(组播)编程(转)
- linux网络编程之二-----多播(组播)编程
- Linux网络编程--(7)广播和组播
- Linux网络编程 之 UDP 组播
- Linux网络编程-UDP组播
- linux 网络编程 -组播通信
- 【Linux网络编程】组播代码
- js比较年月日或者日期年月日时分秒大小
- OpenGl渲染相关
- Practical Machine Learning实用机器学习 章1
- SpringMVC简明教程(一)——搭建
- Linux下执行Shell脚本
- linux网络编程(组播)
- java的学习 持续更新
- For循环的方法和格式和练习
- fragment与activity及两个fragment之间的跳转实现
- [leetcode] Word Break
- Centos7添加epel和elRepo源,并自动挂载硬盘(不修改文件)
- Java I/O : Java中的进制详解
- linux 常用的目录和权限
- java 框架基础知识(1)----反射-->Spring IoC