UDP通讯协议广播和组播实现
UDP 通讯协议广播
UDP广播发送端
#include "myhead.h"
int main(int argc,char **argv)
{
int udpsock;
int ret;
char sbuf[100];
//定义ipv4地址体变量存放需要绑定的ip和端口号
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof(bindaddr));
bindaddr.sin_family=AF_INET;
bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配发送端的ip
bindaddr.sin_port=htons(20000); //发送端端口号
//定义ipv4地址体变量目标主机的ip和端口号
struct sockaddr_in otheraddr;
bzero(&otheraddr,sizeof(otheraddr));
otheraddr.sin_family=AF_INET;
otheraddr.sin_addr.s_addr=inet_addr("192.168.22.255"); //我们课室局域网广播地址
otheraddr.sin_port=htons(30000); //端口号
//创建udp套接字
udpsock=socket(AF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字失败!\n");
return -1;
}
//取消端口绑定的限制
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定ip端口失败了!\n");
return -1;
}
//设置套接字的属性为可以广播
setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
//广播信息给我们课室所有的主机
while(1)
{
bzero(sbuf,100);
printf("请输入要广播发送的信息!\n");
scanf("%s",sbuf);
sendto(udpsock,sbuf,strlen(sbuf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
}
//关闭
close(udpsock);
return 0;
}
UDP广播接收端
#include "myhead.h"
int main(int argc,char **argv)
{
int udpsock;
int ret;
char sbuf[100];
//定义ipv4地址体变量存放需要绑定的ip和端口号
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof(bindaddr));
bindaddr.sin_family=AF_INET;
bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配接收端的ip
bindaddr.sin_port=htons(30000); //接收端端口号
//定义ipv4地址体变量目标主机的ip和端口号
struct sockaddr_in otheraddr;
bzero(&otheraddr,sizeof(otheraddr));
int addrsize=sizeof(otheraddr);
//创建udp套接字
udpsock=socket(AF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字失败!\n");
return -1;
}
//取消端口绑定的限制
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定ip端口失败了!\n");
return -1;
}
//接收广播信息
while(1)
{
bzero(sbuf,100);
recvfrom(udpsock,sbuf,100,0,(struct sockaddr *)&otheraddr,&addrsize);
printf("ip地址是:%s 端口号是:%hu 广播发送过来的信息是:%s\n",inet_ntoa(otheraddr.sin_addr),ntohs(otheraddr.sin_port),sbuf);
}
//关闭
close(udpsock);
return 0;
}
UDP通讯协议组播
UDP组播发送端
#include "myhead.h"
int main(int argc,char **argv)
{
int udpsock;
int ret;
char sbuf[100];
//定义ipv4地址体变量存放需要绑定的ip和端口号
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof(bindaddr));
bindaddr.sin_family=AF_INET;
bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配发送端的ip
bindaddr.sin_port=htons(20000); //发送端端口号
//定义ipv4地址体变量目标主机的ip和端口号
struct sockaddr_in otheraddr;
bzero(&otheraddr,sizeof(otheraddr));
otheraddr.sin_family=AF_INET;
otheraddr.sin_addr.s_addr=inet_addr("225.168.22.7"); //我选定的组播组地址
otheraddr.sin_port=htons(30000); //端口号
//创建udp套接字
udpsock=socket(AF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字失败!\n");
return -1;
}
//取消端口绑定的限制
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定ip端口失败了!\n");
return -1;
}
//设置套接字的属性为可以广播
setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
//组播信息给加入到我指定的组播组里面的机器
while(1)
{
bzero(sbuf,100);
printf("请输入要组播发送的信息!\n");
scanf("%s",sbuf);
sendto(udpsock,sbuf,strlen(sbuf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
}
//关闭
close(udpsock);
return 0;
}
UDP组播接收端
#include "myhead.h"
int main(int argc,char **argv)
{
int udpsock;
int ret;
char sbuf[100];
//定义ipv4地址体变量存放需要绑定的ip和端口号
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof(bindaddr));
bindaddr.sin_family=AF_INET;
bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配接收端的ip
bindaddr.sin_port=htons(30000); //接收端端口号
//定义ipv4地址体变量目标主机的ip和端口号
struct sockaddr_in otheraddr;
bzero(&otheraddr,sizeof(otheraddr));
int addrsize=sizeof(otheraddr);
//创建udp套接字
udpsock=socket(AF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字失败!\n");
return -1;
}
//取消端口绑定的限制
int on=1;
setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定ip端口失败了!\n");
return -1;
}
//加入到发送端指定的那个组播组里面
struct ip_mreq mreq; //定义结构体变量保存组播组信息
bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr("225.168.22.7"); // D类地址
mreq.imr_interface.s_addr = htonl(INADDR_ANY); // 必须用这个宏定义
setsockopt(udpsock, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq)); //把这个主机添加到组播组里面
//接收组播信息
while(1)
{
bzero(sbuf,100);
recvfrom(udpsock,sbuf,100,0,(struct sockaddr *)&otheraddr,&addrsize);
printf("ip地址是:%s 端口号是:%hu 组播发送过来的信息是:%s\n",inet_ntoa(otheraddr.sin_addr),ntohs(otheraddr.sin_port),sbuf);
}
//关闭
close(udpsock);
return 0;
}
UDP通讯协议广播和组播实现相关推荐
- [转]UDP(udp通信、广播、组播),本地套接字
转发参考链接: [陈宸-研究僧] https://blog.csdn.net/qq_35883464/article/details/103741461 [Alliswell_WP] https:// ...
- c/c++:UDP(udp通信、广播、组播),本地套接字
目录 1. udp 1.1 udp通信流程 1.2 操作函数 send.sendto recv.recvfrom 2. 广播 2.1 广播通信流程 2.2 设置广播属性函数:setsockopt 2. ...
- UDP通讯接收案例(组播方式)
1.通讯类: namespace AddMyUtility { public class UDPClientClass { public UDPClientClass(string g ...
- 网络编程-Socket套接字(TCP、UDP、广播和组播通信)
socket套接字 socket是一个编程接口(网络编程接口) 作用是用来实现网络上不同的主机的应用进程之间进行双向通信 套接字是一种特殊的文件描述符 也就意味着我们使用套接字实现网络通信的时候可以用 ...
- Qt网络编程之搭建Udp通信【单播、组播、广播】
由于项目的环境实在局域网内进行传输,所以采用了UDP通信.为此记录一下. UDP概念 UDP(用户数据报协议)是一个简单的面向数据报的传输层协议.提供的是非面向连接的.不可靠的数据流传输.UDP不提供 ...
- java udp 广播 组播_UDP广播和组播的基础知识介绍
UDP广播和组播的基础知识介绍 ━━━━━━━━━━━━━━━━━━━━━━━━━ UDP可以实现一对多的传输方式,即通过广播和组播把数据发送给一组进程.下面就介绍下UDP广播和组播的相关知识. 一. ...
- LWIP应用开发|广播与组播
广播与组播 1. 广播与组播简介 1.1 组网方式 网络中有三种通讯模式:单播.广播.组播(多播) 单播:主机之间"一对一"的通讯模式,网络中的交换机和路由器对数据只进行转发不进行 ...
- 网络通信:单播、广播、组播
网络通信:单播.广播.组播 本文文件夹: 一.网络通信的分类.他们的定义和特点. 二.单播.广播.组播的传输信息的网络拓扑模型. 三.单播.广播.组播的编程实例. 一.网络通信的分类.他们的定义和特点 ...
- Linux系统的广播和组播
广播 广播:在一个局域网内部,所有的终端都能够收到数据包.使用广播的发送数据,会使处于同一个局域网内部的所有用户都必须接收到数据,用户不能拒绝. 注意:在使用广播和组播时,发送方和接收方都要处于同一个 ...
最新文章
- 从FCKEDITOR到ckeditor(二) 撰写自定义对话框,增加数学公式(与webEq的结合)
- Python基础语法精心总结!看完都知道的可以往下继续学习了
- 快速入门系列之 Scala 语言 GitChat连接
- linux常用调试,linux下gdb常用的调试命令
- 因曝光“同事被抬上救护车”被开除?拼多多:该员工在匿名社区发布极端言论...
- LeetCode刷题(41)--Sort Color
- Java中Spring中的方法加上try catch后事务管理器失效无法回滚的情况
- Python_016 XML解析
- M1 Mac 屏幕截图录像工具:CleanShot X
- [转]Mysql FROM_UNIXTIME as UTC
- php保留第一次字符串,php - 字符串处理
- GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
- 计算机组装与维修要学哪些,计算机组装与维修教学基本要求
- 移动硬盘提示“需要格式化”
- 电脑键盘equals在哪个位置_【电脑键盘在哪里调出来】电脑键盘在哪里找_电脑模拟键盘在哪里...
- 【Vue】从零搭建一个Vue项目
- Photoshop 2023 (ps 2023)
- 微信小程序利息计算器
- 史玉柱深度剖析:民营的13种“死法”
- 单链表删除元素之狸猫换太子法