当前位置: 首页 > news >正文

day4网络编程(广播和组播)

1.广播

发送端(类似于客户端)

流程:
创建套接字
填充接收端(服务器)网络信息结构体
bind(非必须绑定)
设置允许广播
向接收端(服务器)发送数据
关闭套接字文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "172.17,94.255"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的网络信息结构体struct sockaddr_in recvaddr;recvaddr.sin_family = AF_INET;recvaddr.sin_port   = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//bind可绑可不绑//设置允许广播int broad = 1;if(-1 == setsockopt(fd,SOL_SOCKET,SO_BROADCAST,\&broad,sizeof(broad))){ERR_MSG("setsockopt");return -1;}printf("broad set success broad = %d\n",broad);char buf[128] = "";ssize_t res = 0;while(1){//向服务器发送数据bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(-1 == sendto(fd,buf,sizeof(buf),0,\(struct sockaddr*)&recvaddr,sizeof(recvaddr))){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭套接字close(fd);return 0;
}

接收端(类似于服务器)

流程:
创建套接字
填充接收端(本身)(服务器)的网络信息结构体
bind(必须) 绑定套接字和自身的网络信息结构体
新建一个网络信息结构体,用来存储发送端的地址信息
接受发送端发来的数据
关闭套接字

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "172.17,94.255"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的网络信息结构体struct sockaddr_in recvaddr;int len = sizeof(recvaddr);recvaddr.sin_family = AF_INET;recvaddr.sin_port   = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//必须绑定if(-1 == bind(fd,(struct sockaddr*)&recvaddr,len)){ERR_MSG("bind");return -1;}printf("bind success\n");//新建一个网络信息结构体,用来存储接受的数据从哪来struct sockaddr_in sendaddr;int sendlen = sizeof(sendaddr);char buf[128] = "";ssize_t res = 0;while(1){//接受发送端(客户端)发来的数据bzero(buf,sizeof(buf));if(-1 == recvfrom(fd,buf,sizeof(buf),0,\(struct sockaddr*)&sendaddr,&sendlen)){ERR_MSG("recvfrom");return -1;}printf("recvfrom success\n");printf("[%s:%d] msg:%s\n",inet_ntoa(sendaddr.sin_addr),\ntohs(sendaddr.sin_port),buf);}//关闭套接字close(fd);return 0;
}

广播

发送端(类似于客户端)

流程:
创建套接字
填充接收端(服务器)的网络信息结构体 (IP为广播组的IP地址)
bind(非必须)
设置允许广播
发送广播信息
关闭套接字

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "224.1.2.3"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的网络信息结构体struct sockaddr_in recvaddr;recvaddr.sin_family = AF_INET;recvaddr.sin_port   = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//bind可绑可不绑//设置允许广播int broad = 1;if(-1 == setsockopt(fd,SOL_SOCKET,SO_BROADCAST,\&broad,sizeof(broad))){ERR_MSG("setsockopt");return -1;}printf("broad set success broad = %d\n",broad);char buf[128] = "";ssize_t res = 0;while(1){//向服务器发送数据bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(-1 == sendto(fd,buf,sizeof(buf),0,\(struct sockaddr*)&recvaddr,sizeof(recvaddr))){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭套接字close(fd);return 0;
}

接收端(类似于服务器)

流程:
创建套接字
填充接收端(自身、服务器)的网络信息结构体(广播组IP…)
bind(必须绑定)绑定服务器与套接字
填充广播组的网络信息结构体(广播组IP,本地IP,网卡编号)
滴滴:查询网卡编号:ifconfig 查看使用的是哪个网卡,再 ip ad 查看对应的编号
添加广播组
新建一个网络信息结构体用来存储发送端的地址信息
循环接受信息
关闭套接字

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "224.1.2.3"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的网络信息结构体struct sockaddr_in recvaddr;int len = sizeof(recvaddr);recvaddr.sin_family = AF_INET;recvaddr.sin_port   = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//必须绑定if(-1 == bind(fd,(struct sockaddr*)&recvaddr,len)){ERR_MSG("bind");return -1;}printf("bind success\n");//加入多播组struct ip_mreqn mq;mq.imr_multiaddr.s_addr = inet_addr(IP);//多播组的组ipmq.imr_address.s_addr  = inet_addr("172.17.94.145");//本地IPmq.imr_ifindex   = 3;//网络设备编号,指定网卡号if(-1 == setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,\&mq,sizeof(mq))){ERR_MSG("setsockopt");return -1;}printf("membership set succes ");//新建一个网络信息结构体,用来存储接受的数据从哪来struct sockaddr_in sendaddr;int sendlen = sizeof(sendaddr);char buf[128] = "";ssize_t res = 0;while(1){//接受发送端(客户端)发来的数据bzero(buf,sizeof(buf));res = recvfrom(fd,buf,sizeof(buf),0,\(struct sockaddr*)&sendaddr,&sendlen);if(-1 == res){ERR_MSG("recvfrom");return -1;}else if(0 == res){printf("发送端退出\n");break;}printf("recvfrom success\n");printf("[%s:%d] msg:%s\n",inet_ntoa(sendaddr.sin_addr),\ntohs(sendaddr.sin_port),buf);}//关闭套接字close(fd);return 0;
}

结果:
在这里插入图片描述

http://www.lryc.cn/news/40880.html

相关文章:

  • Vue3 自动引入组件及函数、动态生成侧边栏路由
  • 人工智能交互系统界面设计
  • 蓝桥杯嵌入式第一课--创建工程
  • Java面向对象:接口的学习
  • 西瓜视频登录页面
  • 【springboot】常用快捷键:
  • 宝塔控制面板常用Linux命令大全
  • C语言实现单链表(超多配图,这下不得不学会单链表了)
  • SQL编写优化技巧
  • 【基础算法】单链表的OJ练习(6) # 复制带随机指针的链表 #
  • Activity生命周期完成EvenetLog回调
  • 西安石油大学C语言期末真题实战
  • 【Shell】Shell变量
  • 你是真的“C”——结构体中鲜有人知的“秘密”
  • 2023年“网络安全”赛项江苏省淮安市赛题解析(超详细)
  • 【二分查找】
  • Vue学习 -- 如何用Axios发送请求(get post)Promise对象 跨域请求问题
  • TVS和稳压管的相同点和不同点
  • 微信小程序项目实例——扫雷
  • 2022-2023年度广东省职业院校学生专业技能大赛 中职组网络安全赛项竞赛规程
  • 超详细的堆排序,进来看看吧。
  • 线性回归 特征扩展的原理与python代码的实现
  • 订阅关系一致
  • 测试老鸟都在用的接口抓包常用工具以及接口测试工具都有哪些?
  • Delphi 一个函数实现腾讯云最新版(API3.0)短信发送
  • 2023年Android现代开发
  • 自然语言处理(NLP)在医疗领域的应用
  • 计算机中的浮点数运算
  • 看了字节跳动月薪20K+测试岗面试题,让我这个工作3年的测试工程师,冷汗直流....
  • 这两天最好的ChatGPT应用;使用Notion AI提升效率的经验(13);AI编程与程序员的生存 | ShowMeAI日报