基于UDP协议的网络通信

devtools/2024/10/9 8:48:21/

        和TCP协议不同的是,UDP协议不需要进行稳定的连接即可直接对数据进行收发,即面向非连接的。所以UDP的应用场景在音视频流传输、在线游戏以及网络聊天室等实时传输需求大的背景。因为不需要建立连接,UDP的网络编程模型就比TCP简单许多。

接收端发送端
创建socket创建socket
准备通信地址准备通信地址
绑定——
接收请求发送请求
响应请求接收响应
关闭socket关闭socket

从这个UDP的网络通信模型可以很直观地看到,TCP的通信双方是客户端和服务器,而UDP通信的双方只是发送端和接收端。下面来看具体实现操作:

首先来看一下接收端:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main(int argc,const char* argv[])
{//创建套接字int svrfd=socket(AF_INET,SOCK_DGRAM,0);if(svrfd<0){perror("socket");return -1;}//准备通信地址(自己)struct sockaddr_in svr_addr={},cli_addr={};svr_addr.sin_family=AF_INET;svr_addr.sin_port=htons(8888);svr_addr.sin_addr.s_addr=inet_addr("192.168.110.12");socklen_t addrlen=sizeof(svr_addr);//绑定地址与套接字if(bind(svrfd,(struct sockaddr *)&svr_addr,addrlen)){perror("bind");return -1;}char buf[4096];size_t buf_size=sizeof(buf);while(1){//接收数据和对方的地址size_t ret=recvfrom(svrfd,buf,buf_size,0,(struct sockaddr *)&cli_addr,&addrlen);if(ret<=0||0==strcmp("quit",buf)){printf("网络异常,通信结束!\n");close(svrfd);return -1;}printf("from %s recv:%s bits:%lu\n",inet_ntoa(cli_addr.sin_addr),buf,ret);//响应sprintf(buf,":return:%s",inet_ntoa(cli_addr.sin_addr));ret=sendto(svrfd,buf,strlen(buf)+1,0,(struct sockaddr *)&cli_addr,addrlen);if(ret<=0){printf("对方网络异常\n");}}close(svrfd);return 0;
}

再来看一下发送端:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>int main(int argc,const char* argv[])
{//创建套接字int clifd=socket(AF_INET,SOCK_DGRAM,0);if(clifd<0){perror("socket");return -1;}//准备通信地址(对方)struct sockaddr_in svr_addr={};svr_addr.sin_family=AF_INET;svr_addr.sin_port=htons(8889);svr_addr.sin_addr.s_addr=inet_addr("192.168.110.26");socklen_t addrlen=sizeof(svr_addr);char buf[4096];size_t buf_size=sizeof(buf);while(1){//发送请求printf(">>>>>");scanf("%s",buf);size_t ret=sendto(clifd,buf,strlen(buf)+1,0,(struct sockaddr *)&svr_addr,addrlen);if(ret<=0||0==strcmp("quit",buf)){printf("对方网络异常\n");close(clifd);break;}//接收响应ret=recvfrom(clifd,buf,buf_size,0,(struct sockaddr *)&svr_addr,&addrlen);if(ret<=0){printf("网络异常,通信结束!\n");close(clifd);return -1;}printf("from %s recv:%s bits:%lu\n",inet_ntoa(svr_addr.sin_addr),buf,ret);}close(clifd);return 0;
}

下面我来进行一下测试:

由上图,图2中由发送端发送数据到接收端,接收端接收并打印数据,并添加“:return”响应返回给发送端,最后输入quit结束通信,由此完成UDP的网络服务通信。


http://www.ppmy.cn/devtools/123293.html

相关文章

xilinx中bufgce

在Xilinx的FPGA设计中&#xff0c;BUFGCE是一种重要的全局时钟缓冲器原语&#xff0c;它基于BUFGCTRL并以一些引脚连接逻辑高电位和低电位。以下是对BUFGCE的详细解析&#xff1a; 一、BUFGCE的功能与特点 功能&#xff1a;BUFGCE是带有时钟使能信号的全局缓冲器。它接收一个时…

怎样查局域网里的所有ip?

如果想高效管理网络设备&#xff0c;识别配置、更新和维护各类连接设备&#xff0c;排查网络故障&#xff0c;提升网络安全性&#xff0c;监控异常 IP 活动&#xff0c;发现潜在威胁等需要知道局域网。那么怎样查局域网里的所有ip呢&#xff1f; 一、局域网IP是什么&#xff1…

使用Selenium自动化测试定位iframe以及修改img标签的display属性值

在使用 Selenium 进行自动化测试时&#xff0c;处理 iframe 是一个常见问题。当页面中出现 iframe 时&#xff0c;需要先切换到该 iframe 内部&#xff0c;才能正常定位和操作其中的元素。以下是处理 iframe 的步骤和示例代码&#xff1a; 步骤 切换到 iframe&#xff1a;使用…

RabbitMQ安装(Ubuntu环境)

安装Erlang RabbitMq需要Erlang语⾔的⽀持&#xff0c;在安装rabbitMq之前需要安装erlang # 更新软件包 sudo apt-get update # 安装 erlang sudo apt-get install erlang 查看erlang版本 erl 退出命令 halt( ). 安装RabbitMQ # 更新软件包 sudo apt-get update # 安装 rabbi…

C/C++语言基础--C++IO流、输入输出流、文件流、字符串流、重定向流等详解

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 流思想&#xff0c;我认为在计算机中是一个很重要的思想&#xff0c;因为计算机、编程无非就是获取数据&#xff0c;然后对数据进行操作&#xff1b;C给主要给我们提供了3种流&#xff0c;输入输出流、文件流…

遗传算法与深度学习实战(16)——神经网络超参数优化

遗传算法与深度学习实战&#xff08;16&#xff09;——神经网络超参数优化 0. 前言1. 深度学习基础1.1 传统机器学习1.2 深度学习 2. 神经网络超参数调整2.1 超参数调整策略2.2 超参数调整对神经网络影响 3. 超参数调整规则小结系列链接 0. 前言 我们已经学习了多种形式的进化…

聚观早报 | 苹果重磅更新;OpenAI推出ChatGPT Canvas

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 10月1日消息 苹果重磅更新 OpenAI推出ChatGPT Canvas Meta发布Movie Gen iQOO 13影像规格曝光 华为HarmonyOS N…

如何使用 Puppeteer 和 Browserless 运行自动化测试?

Puppeteer&#xff1a;什么是 Puppeteer 及其功能 Puppeteer 是一个 Node.js 库。使用 Puppeteer&#xff0c;您可以在所有基于 Chromium 的浏览器上测试您的网站&#xff0c;包括 Chrome、Microsoft Edge Chrome 和 Chromium。此外&#xff0c;Puppeteer 可用于网页抓取、自动…