UDP双向通信示例

关于UDP双向通信原理解释与范例 首先,我们需要了解什么叫做UDP,之前博主有些过TCP的通信范例,我们可以了解到的是一个的,进行的方式。同样上oror技术则一个对接。而,是自身直接一个当然,我也不是说它是很牛逼的,这个技术固然很好,但也有缺点。UDP本身的网络通信是不稳定的,从概率学上讲使用这种技术一定会在某个时间,某个地点,丢失某些数据。SO,I'm not advice use it. BUT,因为总有一些同学希望可以了解这种通信,那么就浅浅的说亿下下。 阅读详情

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

OK.Let‘s do it; 

首先,我们需要了解什么叫做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


 举例子:将缓冲区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_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;
}

 再来看实际操作:

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

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

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

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

原文链接:https://blog.youkuaiyun.com/caiji667788/article/details/127461622

网络编程——UDP的双向通信 UDP之间的通信不需要实现连接,直接发送数据,不稳定,容易丢包。 阅读详情

相关推荐

UDP简单通信例子

/* *通过Udp将文字发送出去 * 提供数据,封装数据包 * socket发送 * 关闭资源 */class UdpSendDemo { public static void main(String[] args) throws IOException { //创建udp服务 DatagramSocket ds = new DatagramSock

Lee的程序空间 883

深入了解UDP协议:特点、应用场景及市面上常见软件案例

总体而言,UDP的设计注重在特定场景下提供高效、快速的数据传输,适用于对实时性要求较高、可以容忍一定数据丢失的应用。UDP(User Datagram Protocol)由于其无连接、无状态、不可靠的特性,适用于一些特定的应用场景,特别是那些对实时性要求较高、能够容忍一定数据丢失的情况。需要注意的是,尽管UDP在以上场景中具有优势,但由于其不可靠性,开发者在选择UDP时需要权衡实时性和数据完整性之间的关系,确保其适用于具体的应用需求。然而,与TCP不同,UDP的校验和是可选的,可以选择关闭。

double222222的博客 2447

基于Netty实现UDP双向通信

1、Channel继承关系 关于ChannelPipeline原理可参考:https://blog.youkuaiyun.com/qq_21033663/article/details/105674261 2、NIO Channel分类 1)NioDatagramChannel:发送和接收数据包,支持TCP和UDP,对DatagramSocket和selector进行封装 2)NioServerSocketChannel:服务端使用,对JDK的ServerSocketChannel进行了封装 3)NioSocketC

猴子哥哥的博客 7424

网络与通信程序设计-基于UDP的广播通信实例

SOBROADCAST 选项设置套接字传输和接收广播消息,如果给定套接字已经被设置为接收或者发送广播数据,查询此套接字选项将返回TRUE,此选项对于那些不是SOCK_STREAM类型的套接字有效。由于UDP协议本身异常简单,实际上只为IP传输起到了桥梁的作用,在一些场景上通过【 应用层->UDP->IP 】的封装方式,可以极大的提高程序调用效率。4,由于UDP协议本身异常简单,实际上只为IP传输起到了桥梁的作用,在一些场景上通过应用层->UDP->IP的封装方式,可以极大的提高程序调用效率。

陈丹宇的博客 3182

UDP服务器客户端相互通信

UDP服务器、客户端之间的相互通信 之前的版本只能实现UDP服务器之间单发单收,此版本能实现UDP服务器和客户端之间的相互通信。 见下面的程序: udp_server.c #include #include #include #include #include #include #include #define PORT 3333 int main() { int

zm1_1zm 3737

MINA2框架下的UDP双向通信演示:Echo服务器实现

在探索复杂网络协议的高效实现前,我们首先要熟悉一个强大的通信框架 — MINA2。MINA2不仅仅是一个简单的网络库,它是一个全面的、基于Java的通信框架,旨在简化网络编程。它为开发者提供了丰富的API来构建客户端和服务器端的程序,尤其是对于UDP协议的支持,使得处理网络包变得异常轻松。MINA2的设计哲学是使网络编程变得模块化、简单化。它的核心组件包括一个灵活的事件循环模型和一套过滤器链机制,这允许开发者在消息处理过程中插入自定义的过滤器。

weixin_42515392的博客 768

Linux之UDP组播示例——双向通信

//a.c 先发数据后等待接收,b.c 先等待接收数据后发送数据   // a.c #include &lt;sys/types.h&gt; #include &lt;sys/socket.h&gt; #include &lt;arpa/inet.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;st...

cyan 1万+

Simulink连接X-Plane 10的UDP双向通信工程包(含实时同步与控制示例)

提供开箱即用的Simulink与X-Plane 10联动方案,通过标准UDP协议实现飞行数据实时采集和控制指令下发。getData_from_xplane10.mdl持续接收X-Plane输出的姿态、速度、经纬高、舵面偏转等20+项飞行状态参数,可用于算法验证、控制器调试或信号分析;commands_to_xplane10.mdl支持向模拟器发送前轮转向、油门、升降舵、方向舵等执行指令,构建闭环控制回路。setup_xplane.mdl统一管理IP地址、端口号及UDP数据包格式,RealTime_Pacer

dd012的博客 217

QT UDP练习

QT UDP练习 一、简述       简单的基于UDP协议的双向通信 练习。       例子打包:链接: https://pan.baidu.com/s/1k87goWpadgdHvQRTAm_2-Q 提取码: ug7e  二、效果 三、工程结构 四、源文件 Udp1.pro文件 QT +=widgets gui network HEADERS += \ u...

Genven_Liang的博客 791

基于UDP的客户端服务器双向通信实现详解

UDP(用户数据报协议)是一种轻量级的传输层协议,采用无连接机制,无需建立和维护会话状态,因而具备低开销、高效率的特点。其头部仅8字节,包含源端口、目的端口、长度和校验和字段,结构简洁,传输延迟小,适用于实时音视频流、在线游戏和DNS查询等对时延敏感的场景。由于UDP不保证可靠性,数据包可能丢失、重复或乱序,因此需在应用层实现必要的重传、确认或序列号机制以提升通信质量。此外,UDP保留消息边界,每个sendto调用对应一个独立数据报,避免了TCP的流式粘包问题。

weixin_33173126的博客 878

AI重塑运营商CRM:从传统办理到智能推荐的实战经验

本文探讨了AI技术如何重塑运营商CRM系统,从传统办理模式升级为智能推荐平台。文章首先分析了传统CRM系统在产品推荐效率、客户信息录入、业务流程和个性化服务等方面的痛点,提出AI赋能的解决方案。技术架构采用分层设计,包含智能推荐引擎、知识图谱系统和大模型集成三大核心模块。实战案例详细介绍了基于深度学习的智能推荐系统实现,包括用户行为特征提取、产品特征建模、推荐模型训练和实时推荐服务等关键组件代码实现,展示了AI如何提升运营商CRM系统的智能化水平和服务效率。

技术传感器的博客 1048

服务端基于Netty4的UDP双向通信Demo演示

【前言】 NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文)。 本文将演示的是一个基于Netty4的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。实际上,Netty4的UDP例

okkeqin的专栏 1万+

GD32F103入门实践(一)配置环境,搭建工程模板,烧写程序

写在前面 本系列博客是我初学GD32F103的操作实录,我个人是个小白,在学习过程中真的也遇到了不少坑,因此我希望能记录下来,帮助到同样踩坑的你。 我的芯片是GD32F103ZE,软件是Keil,烧写用的是JLink。 材料准备 首先我在兆易创新官网(兆易创新),下载相关的文件。点击资料下载,在搜索框里输入“GD32F10”可以得到相关的资料,其他芯片类似。比较重要的是GD32F10x AddOn和GD32F10x Firmware Library(固件库),这两个必须下载。 下载Keil MDK5,这

qq_41208487的博客 3万+

linux网络编程——UDP的实现

在本文中,我们将通过一个简单的UDP服务器和客户端示例来展示如何使用C语言实现基于UDP协议的双向通信。我们将创建两个线程,分别负责接收和发送数据,模拟一个基础的UDP客户端与服务端通信场景。文章末尾附完整代码。

2302_77067109的博客 899

【2025最新版】ABAP 开发百科全书专栏文章目录(上)

本文汇总了一系列SAP ABAP技术文章,内容涵盖实用技巧合集、函数式编程实践(如Currying、reduce应用)、设计模式实现(如Visitor、Singleton)、动态代理与Mock技术、性能优化方案(如Lazy Loading)、日期处理与内存管理,以及ABAP与JavaScript的编程范式对比。还涉及CDS视图、Fiori字段追踪、单元测试优化等实战经验,深入剖析了ABAP底层机制(如Internal Session、Function Module实现原理),并提供了多种反模式改进方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2461

有道龙虾LobsterAI vs. OpenClaw:对比与安装部署攻略

LobsterAI是"中国版OpenClaw",更注重易用性和中文场景适配;OpenClaw是技术极客的玩具,需要大量命令行操作。

lpfasd123的博客 2393

【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

前言 NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已经被取消开发了:详见此文)。本文将演示的是一个基于MINA2的UDP服务端和一个标准UDP客户端(Java实现)双向通信的完整例子。实际上,MINA2的官方代码里有完整的...

hellojackjiang2011的博客 318

4位无符号比较器设计

4位无符号比较器设计

好好学习,天天向上 7891

NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

为什么80%的码农都做不了架构师?>>> ...

weixin_34337381的博客 418

verilog实现步进电机脉冲分配器(三相六拍)基于Nexys4DDR开发板

使用Verilog HDL设计的一个能够自启动、具有正反转功能的三相六拍步进电机脉冲分配器。已经写好Nexy4DDR的管脚约束文件 可以通过Nexys4DDR开发板的PMOD接口连接步进电机进行调试。 使用verilog语言 在vivado2018.2下运行编译下载都正确,(也可在ISE,QuartusII下使用)下面是工程截图: ...

QQ_778132974的博客 2589

UNet 改进(19):与ASPP结合的图像分割模型

这个代码实现了一个改进版的UNet模型,在传统的UNet架构基础上,引入了ASPP模块来增强模型捕获多尺度上下文信息的能力。​​UNet主干网络​​:经典的编码器-解码器结构,带有跳跃连接​​ASPP模块​​:位于瓶颈层,用于提取多尺度特征。

2401_82355416的博客 877

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

为什么80%的码农都做不了架构师?>>> ...

weixin_34376986的博客 637

华为OD机考真题 新系统 9月23号 【世界杯徽章换购】多语言题解

华为OD机试真题 新系统【世界杯徽章换购】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【世界杯徽章换购】多语言题解。

qq_45776114的博客 685

UDP双向通信

UDP(用户数据报协议)是一种无连接的、不可靠的传输层协议,适用于那些对数据传输速度有较高需求而不需要严格有序到达的应用场景,如在线游戏、实时视频聊天等。在UDP中,双向通信是指客户端和服务器都可以发送和接收消息。

xixixixixixixi21的博客 688

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

申明:本文由作者基于日常实践整理,希望对初次接触MINA、Netty的人有所启发。如需与作者交流,见文签名,互相学习。 学习交流 更多学习资料:点此进入推荐 移动端即时通讯交流:215891622推荐 前言 NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的无非就是MINA和Netty了,MINA目前的主要版...

hellojackjiang2011的博客 416

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

UDP协议实现交流通信

UDP协议实现交流通信 1.创建套接字 2.地址绑定 3.循环的接收消息和发送消息 4.关闭套接字 #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include &l

ZHOUJIforever的博客 210
上一篇: Linux模块文件如何编译到内核和独立编译成模块
下一篇: git submodule 使用教程
土豆西瓜大芝麻
博客等级 码龄18年 1189粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值