注:本文不提供UDP通信的头文件

OK.Let‘s do it; 

首先,我们需要了解什么叫做UDP,之前博主有些过TCP的通信范例,我们可以了解到TCP通信是一个稳定的,可以进行双边通信的方式。同样附带进程or线程or IO多路复用技术则可以实现一个服务器对接多个客户端

UDP,是可以通过自身绑定的端口号直接实现一个服务器对接多个客户端。当然,我也不是说它是很牛逼的,这个技术固然很好,但也有缺点。UDP本身的网络通信是不稳定的,从概率学上讲使用这种技术一定会在某个时间,某个地点,丢失某些数据。SO,I'm not advice use it. BUT,因为总有一些同学希望可以了解这种通信,那么就浅浅的说亿下下。

-------------------------------------我是分割线-------------------------------------------

一,关于UDP与TCP之前通信方式的建立区别。

首先来讲一下,TCP建立流程:如下

TCP服务器:【创建自身socket文件】->【绑定自身的IP号与端口号】->【建立监听线】->【接收外部发来的接入请求or数据】->【开始收or发数据】 对应的函数分别为 socket、bind、listen、accept、(send | recv)

TCP客户端:【创建socket】->【搜寻ip和port请求接入】->【开始收or发数据】对应的函数为: socket 、connect、(send | recv) 

----------------------------------我是分割线----------------------------------------------------------

接下来讲一下,UDP建立流程:如下

UDP服务器:【创建自身socket文件】->【绑定自身的端口号】->【开始收or发数据】对应的函数为socket、bind、(sendto | recvfrom)

UDP客户端:【创建自身socket文件】->【搜寻port】->【开始收or发数据】对应的函数为socket、(sendto | recvfrom)

----------------------------------------------------------------------------------------------------

对比一下,是不是少了accept和listen函数,其次收发数据换成了sendto和recvfrom函数。其他的都一样。

但其实大体上思路没有变化,只是把accept和listen函数里面的参数加入到了原本的(send | recv) 两个函数中,然后换个名字就行了。

那么我们可以看一下这几个函数的详细信息,如下:send

 举例子:将缓冲区buf里面的内容发送至通过socket链接的对端

char buf[20]={0};
send(socket,buf,sizeof(buf),0);

同理recv(socket,buf,sizeof(buf),0);就是通过socket链接对端发送数据放到buf里

再来看一下关于sendto的说明:sendto

来,举个栗子:结构体BB捕捉的IP地址和端口号通过socket链接,再把buf里面的内容发出去

char buf[20]={0};
sendto(socket,buf,strlen(buf),0,(struct sockaddr *)&BB,client); 

同理recvfrom(socket,buf,sizeof(buf),0,(struct sockaddr *)&BB,&client);就是socket链接的对端发送数据放到buf里。结构体BB为固定端口号,IP不固定。

-----------------------------------我是分割线---------------------------

听迷糊了是不?来,上实际例子和操作。

二,关于UDP通信实际操作

如下:UDP服务器 

#include "../../all.h"
int main(int argc, const char *argv[])
{int fa=socket(AF_INET,SOCK_DGRAM,0); //创建UDP类型套接字  使用协议为sock_dgramif(fa<0){printf("UDP套接字文件创建失败!\n"); return -1;}struct sockaddr_in AA; //创建用于自身绑定的IP和端口号结构体文件AA.sin_addr.s_addr =INADDR_ANY;  //服务器自动接收IP地址进行绑定AA.sin_port = htons(atoi(argv[1]));AA.sin_family = AF_INET;int fb=bind(fa,(struct sockaddr*)&AA,sizeof(AA));if(fb<0){printf("绑定失败!\n");return -1;} printf("绑定成功!\n");char buf[20]={0};  //设定缓冲区用于接收客户端发来的连接请求数据while(1)  //保证接收多个客户可重复取到{struct sockaddr_in BB; //用于接收客户端发送的连接数据orIP和端口号的结构体memset(&BB,0,sizeof(BB));int client =sizeof(BB);recvfrom(fa,buf,sizeof(buf),0,(struct sockaddr*)&BB,&client);printf("客户端IP =%s  端口号=%d\n",inet_ntoa(BB.sin_addr),ntohs(BB.sin_port));printf("buf=%s",buf);printf("请输入需要广播的内容:");fgets(buf,sizeof(buf),stdin);sendto(fa,buf,strlen(buf),0,(struct sockaddr *)&BB,client); //发送广播内容}close(fa);return 0;
}

注*:服务器设计是先接收接入的IP和UDP信息,然后服务器发送一个消息至刚才接入的客户端然后其他客户端回复一个消息才能接收到服务器下一个消息

翻译:(哪个客户端想呼叫服务器了,就连接服务器。连接完毕后服务器必须在下一个客户端抢占通传输通道前发送消息。否则服务器发送的数据会搞错成最近一个接入的客户端)

如下:UDP客户端

#include "../../all.h"
int main(int argc, const char *argv[])
{int fa = socket(AF_INET,SOCK_DGRAM,0); if(fa<0){printf("UDP套接字文件创建失败!\n");return -1;}struct sockaddr_in AA; //创建要用的结构体,用于捕捉相应的端口号和IP号AA.sin_addr.s_addr = inet_addr(argv[1]);AA.sin_port = htons(atoi(argv[2]));AA.sin_family = AF_INET;char buf[20]={0};while(1){   int len = sizeof(AA);memset(buf,0,sizeof(buf));printf("输入内容:");fgets(buf,sizeof(buf),stdin);sendto(fa,buf,sizeof(buf),0,(struct sockaddr*)&AA,sizeof(AA));memset(buf,0,sizeof(buf));recvfrom(fa,buf,sizeof(buf),0,(struct sockaddr *)&AA,&len);printf("%s\n",buf);}close(fa);return 0;
}

 再来看实际操作:

但本次所写的代码只能实现1:1的回复,即你发一句,我收一句。我发一句,你收一句。

所以该UDP写法存在局限性,无法实现像QQ聊天框那种情况,但是可以把这个代码嵌入到普通的对讲机中,相对而言还是不错的。

每次服务器发送的对象,只能是上一个发送数据的客户端,因为发送后我们清除了接收结构体里面携带的客户端IP和端口号所以服务器端发送时,无法精准捕捉回复的具体对象

但是他也有优点,就是多对一便捷!!!

好啦,本次讲解就到此结束,若有不明白,有错的地方,欢迎私聊博主纠正。

关于UDP双向通信原理解释与范例相关推荐

  1. P2P UDP NAT 原理 穿透

    关键词: P2P UDP NAT 原理 穿透 Traveral Symmetric Cone 原始作者: Hwycheng Leo(FlashBT@Hotmail.com) 源码下载: http:// ...

  2. 通过 UDP 发送数据的简单范例

    package j2se.core.net.udp; import java.io.IOException; import java.net.DatagramPacket; import java.n ...

  3. [分享]Host文件的原理解释及应用说明

    Host文件的原理解释及应用说明 <?XML:NAMESPACE PREFIX = O /> Host文件位置及打开方式: Window系统中有个Hosts文件(没有后缀名), Windo ...

  4. Objective-C中,ARC下的 strong和weak指针原理解释

    Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是& ...

  5. t-sne原理解释_T-SNE解释-数学与直觉

    t-sne原理解释 The method of t-distributed Stochastic Neighbor Embedding (t-SNE) is a method for dimensio ...

  6. LSSS线性秘密共享方案详细构造方法与原理解释

    关于LSSS线性秘密共享方案详细构造方法与原理解释 文章目录 1.LSSS定义 2.Access Tree转化为LSSS矩阵方法 3.LSSS算法正确性证明 1.LSSS定义 LSSS英文精确定义如下 ...

  7. NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    2019独角兽企业重金招聘Python工程师标准>>> 前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目 ...

  8. PNP+NMOS用于充电的原理解释

    PNP+NMOS用于充电的原理解释 作者:AirCity 2019.10.19 aircity007@sina.com MT2503和展讯SL8521E线性充电方案,都需要外部的PNP+NMOS芯片配 ...

  9. 全局最优和局部最优 世俗理解以及原理解释

    引言 今天逛知乎看到这样一个问题和回答,让我瞬间理解局部最优和全局最优 在诸如算法导论等书是这样解释的:全局最优是在全局选取一个最佳值,而局部最优是在某一部分选取一个最佳值.每一部分都选取最佳值(即局 ...

最新文章

  1. 35岁以前成功的12条黄金法则(1)
  2. 病毒导致win2003服务器共享丢失业务中断
  3. SQL SERVER 导入EXCEL的存储过程
  4. numpy.random.rand、numpy.random.randn
  5. 【研究方向是SDN该怎么做?】软件定义网络(SDN)的安全挑战和机遇
  6. linux中文件大小设置函数,truncate函数和ftruncate修改文件大小-linux
  7. linux 卷标设置与管理
  8. [kubernetes] comands
  9. v-for key的作用
  10. USB转双串口产品设计-RS485串口
  11. 可拖拽的窗口(Vue)
  12. 魔兽争霸3-游戏简单剖析 No.2 物品
  13. PHP在线工具箱源码站长引流+在线工具箱源码+多款有趣的在线工具+一键安装
  14. 【设计模式】快速全面通俗易懂的设计模式讲解(以大白话例子讲解)
  15. 发现谷歌学术搜索真好用啊
  16. MATLAB做驻波,SMB色谱分离驻波优化设计的一种Matlab实现
  17. 电脑测试,模拟微信内置浏览器Firefox/chrome
  18. RSCP RSRP RSRQ
  19. linux登录pg数据库命令,PostgreSQL数据库pg_dump命令行不输入密码的方法
  20. 【20180125】【Matlab】矩阵对列、行、所有元素求和

热门文章

  1. Java 工具类:风向度数(角度°)转风向,附风向16方位图
  2. StringUtils.isBlank,equals与==的判断参数分析
  3. 深富策略:资源股高位杀跌消费白马迎来反攻能否配置
  4. ibd文件结构组成(带图详解)
  5. exchange 服务器设置自动答复,如何让EXCHANGE 2010用户邮箱自动回复每一封邮件。...
  6. 定积分的特殊计算方法
  7. echarts图表实战
  8. 2021华为杯研究生数学建模竞赛B题思路分析+代码
  9. LVDS高速PCB布局布线设计
  10. 阅读英文原版计算机书籍的一些经验