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

这篇具有很好参考价值的文章主要介绍了关于UDP双向通信原理解释与范例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

一,关于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

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

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

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

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

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

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

来,举个栗子:结构体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通信实际操作

如下:UDP服务器 

#include "../../all.h"
int main(int argc, const char *argv[])
{
	int fa=socket(AF_INET,SOCK_DGRAM,0); //创建UDP类型套接字  使用协议为sock_dgram
	if(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;
}

 再来看实际操作:

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

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

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

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

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

好啦,本次讲解就到此结束,若有不明白,有错的地方,欢迎私聊博主纠正。文章来源地址https://www.toymoban.com/news/detail-417990.html

到了这里,关于关于UDP双向通信原理解释与范例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 数据帧、IP数据包、TCP、UDP报文格式详解----网络通信原理

    数据帧、IP数据包、TCP、UDP报文格式详解----网络通信原理

    物理层是TCP/IP模型的最底层,物理层定义其设备的 物理特性、电气特性 等,比如 网络接口卡、中继器、集线器、网线、无线电 。 物理层作用确保设备之间连接正常,包括建立、维护和断开物理连接等,物理层传输数据是通过电信号中的高低电压和低电压,也就是0101010的比

    2024年02月02日
    浏览(160)
  • 【云服务器】关于UDP/TCP跨平台网络通信服务器无响应的情况及解决办法

    【云服务器】关于UDP/TCP跨平台网络通信服务器无响应的情况及解决办法

    本篇文章仅为了记录我在跨平台进行udp通信的时候遇到的问题及解决办法 进行udp网络通信的时候,我用腾讯云服务器作服务端,windows本机作客户端,在进行连接的时候,当我在客户端向服务端发送消息的时候,服务器端接收不到消息(安全组已经配置) 当执行上述命令出现

    2024年02月10日
    浏览(14)
  • 【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    我们用Java实现UDP数据报套接字编程,需要借用以下API来实现 网络编程, 本质上是要操作网卡. 但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡. 因此进行网络通信, 势必需要先有一个 socket 对象. DatagramSocket 是UDP Socket,

    2024年03月11日
    浏览(13)
  • 关于设置静态IPV4静态地址后ipconfig/all发现IPV4首先是169开头的IP

    关于设置静态IPV4静态地址后ipconfig/all发现IPV4首先是169开头的IP

     解决办法一: 出现这种情况一般是IP地址冲突,换一个IP地址。 解决办法二: 1、windows+R 输入cmd进入命令行。 2、输入  netsh winsock reset 后回车 , 稍后,会有成功的提示:成功地重置Winsock目录→重启计算机完成重置。 3、之后输入 netshintIPreset.log (按回车键执行命令) 4、之

    2024年04月25日
    浏览(8)
  • 直接上代码解释TCP/UDP

    直接上代码解释TCP/UDP

    连接方式:TCP是面向连接的,UDP是无连接的。 可靠性:TCP提供可靠数据传输,UDP不保证可靠性。 数据传输方式:TCP使用字节流传输,UDP使用数据报传输。 传输效率:TCP传输效率相对较低,UDP传输效率高。 TCP就是在不可靠的信道上建立可靠的连接,TCP传输需解决三次握手和四

    2024年02月16日
    浏览(6)
  • 【物联网】直接上代码解释TCP/UDP

    【物联网】直接上代码解释TCP/UDP

    连接方式:TCP是面向连接的,UDP是无连接的。 可靠性:TCP提供可靠数据传输,UDP不保证可靠性。 数据传输方式:TCP使用字节流传输,UDP使用数据报传输。 传输效率:TCP传输效率相对较低,UDP传输效率高。 TCP就是在不可靠的信道上建立可靠的连接,TCP传输需解决三次握手和四

    2024年02月14日
    浏览(8)
  • 不真实、难解释?让大模型更安全,3位前沿学者告诉我们能做什么

    不真实、难解释?让大模型更安全,3位前沿学者告诉我们能做什么

    在上月举行的“2022大模型创新论坛 · 模型技术安全与治理峰会”上,加州伯克利分校助理教授 Jacob Steinhardt、Anthropic 联合创始人 Chris Olah、 纽约大学终身副教授Samuel Bowman 阐述了他们对模型安全这一领域的前沿解读。 如果你正在从事这一领域研究,欢迎扫码申请加入我们的

    2023年04月18日
    浏览(13)
  • 【数据结构】带头双向循环链表---C语言版(单链表我们分手吧,不要再找我玩了!!!)

    【数据结构】带头双向循环链表---C语言版(单链表我们分手吧,不要再找我玩了!!!)

    在前面我们学习实现了单链表(无头单向不循环链表),这里我们引入带头双向循环链表 很明显这两种链表的结构截然不同,但都是作为链表最常使用链表结构 前者因其结构上的缺点而作为面试考题的常驻嘉宾,而且复杂麻烦 后者则是以结构最优著称,实现起来也是非常的

    2024年02月10日
    浏览(46)
  • TCP通信—客户端与客户端的双向通信

    TCP通信—客户端与客户端的双向通信

    1.实现客户端与客户端之间的TCP双向通信; 2.服务器记录客户端实名连接,并显示客户端数据记录; 3.客户端退出,服务器和另一客户端显示相应提示; 1.定义数组保存客户端文件描述符; 2.主程序负责接收客户端1的数据发送给客户端2; 3.开展一个线程负责接收到客户端2的

    2024年02月15日
    浏览(8)
  • WebSocket 双向通信

    WebSocket 双向通信

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 消息推送的常见方式 : 轮询方式: 客户端发起轮询请求: 客户端定期(例如每隔一定时间)向服务器发送

    2024年01月21日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包