基于UDP协议的网络通信

news2024/11/23 1:22:10

        和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.coloradmin.cn/o/2196035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt - ui界面点击加载一段时间后闪退

Qt - ui界面点击加载一段时间后闪退 解决方案&#xff1a; 该路径下删除 widgetbox6.8.xml 文件即可&#xff0c;然后重新打开 QT 就可以成功打开 UI 界面了

【2024最新】基于springboot+vue的交流互动系统lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

Spring Boot框架下的足球青训俱乐部管理

2 相关技术简介 2.1 Java技术 Java是一门伟大的纯面向对象的编程语言和编程语言。同时&#xff0c;它还是Java语言从嵌入式开发到企业级开发的平台。Java凭借其一次编译&#xff0c;任何地方执行的优点&#xff0c;使得盛行的web应用程序有大量的Java编译&#xff0c;很好地支…

【AIGC】ChatGPT提示词Prompt高效编写模式:结构化Prompt、提示词生成器与单样本/少样本提示

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;结构化Prompt (Structured Prompt)组成元素应用实例优势结论 &#x1f4af;提示词生成器 (Prompt Creator)如何工作应用实例优势结论 &#x1f4af;单样本/少样本提示 (O…

LeetCode讲解篇之746. 使用最小花费爬楼梯

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 爬到第i层的最小花费 min(爬到第i - 1层的最小花费 从第i - 1层向上爬的花费, 爬到第i - 2层的最小花费 从第i - 2层向上爬的花费) 设f[i]为爬到第i层的最小花费 则f[i] min(f[i - 1] cost[i - 1], f[i -…

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)

红外变电站分割数据集&#xff0c;标注为json格式&#xff0c;总共有5类 避雷器&#xff08;289张&#xff09;&#xff0c;绝缘子&#xff08;919张&#xff09;&#xff0c;电流互感器&#xff08;413张&#xff09;&#xff0c;套管&#xff08;161张&#xff09;&#xff0…

IDEA:增加类注释模板和方法注释模板

文章目录 概要配置类注释模板配置方法模版 概要 配置类注释和方法注释 配置类注释模板 点击setting->Editor->File and Code Templates&#xff0c;然后找到Class&#xff0c;如下图&#xff1a; 注意勾掉Reformat according to style&#xff0c;否则会格式化。 注…

Revisiting Graph-Based Fraud Detection in Sight of Heterophily and Spectrum

AAAI24 推荐指数&#xff1a; #paper/⭐ 领域&#xff1a;异常检测 摘要 这篇文章是关于一种新型的基于图神经网络&#xff08;GNN&#xff09;的欺诈检测方法&#xff0c;称为SEC-GFD&#xff08;Spectrum-Enhanced and Environment-Constrainted Graph Fraud Detector&…

黑马JavaWeb开发跟学(十二)SpringBootWeb案例

黑马JavaWeb开发跟学十二.SpringBootWeb案例 案例-登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令…

第100+27步 ChatGPT学习:概率校准 Temperature Scaling

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

基于PHP猫咖私人影院系统【附源码】

效果如下&#xff1a; 系统首页界面 用户注册界面 包厢信息界面 零食信息界面 管理员登录界面 包厢预订界面 猫咪信息界面 研究背景 近年来&#xff0c;随着生活品质的提升和个性化消费需求的增长&#xff0c;猫咖和私人影院等新兴休闲娱乐方式逐渐受到年轻人的青睐。猫咖结合…

Github 2024-10-08 Python开源项目日报Top10

根据Github Trendings的统计,今日(2024-10-08统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10JavaScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次关注人数…

毕设 深度学习图像搜索算法-图像搜索引擎(源码分享)

文章目录 0 简介1 前言2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例最后 0 简介 今天学长向大家分享一个毕业设计项目 毕业设计 深度学习图像搜索算法-图像搜索引擎(源码分享) 项目运行效果&#xff1a; 毕业设计 深度学习图像搜索算法-图…

【ESP32】ESP-IDF开发 | Timer硬件定时器+定时器闹钟例程

1. 简介 ESP32内置4个64-bit通用定时器。每个定时器包含一个16-bit预分频器和一个64-bit可自动重新加载向上/向下计数器。ESP32的定时器分为2组&#xff0c;每组2个。定时器具有闹钟功能&#xff0c;闹钟事件会引发重新加载和触发中断。 硬件定时器的时钟是由APB时钟提供的&…

sqli-labs靶场第三关less-3

sqli-labs靶场第三关less-3 1、确定注入点 http://192.168.128.3/sq/Less-3/?id1 http://192.168.128.3/sq/Less-3/?id2 有不同回显&#xff0c;判断可能存在注入&#xff0c; 2、判断注入类型 输入 http://192.168.128.3/sq/Less-3/?id1 and 11 http://192.168.128.3/sq/L…

Linus Torvalds 要求内核开发人员编写更好的 Git 合并提交信息

昨天在宣布 Linux 6.12-rc2 内核时&#xff0c;Linus Torvalds 要求内核维护者在提交信息方面做得更好。Torvalds 尤其希望内核维护者在描述拉取请求中的变更时&#xff0c;能更好地使用积极、命令式的语气。 Linux创建者在6.12-rc2 公告中解释道&#xff1a; 总之&#xff0c…

Arduino UNO R3自学笔记21 之 Arduino基础篇学习总结

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;目前将Arduino的大多数基础内容学习了&#xff0c;做个总结。 1.编程语言 学习单片机&#xff0c;在面向单片机编程时&#xff0c;语言是最基础的&#…

Docker exec bash -c 使用详解与 Python 封装示例

简介&#xff1a;docker exec 是 Docker 的一个实用命令&#xff0c;允许在正在运行的容器中执行命令。通过 bash -c 选项&#xff0c;可以执行复杂的命令串。 历史攻略&#xff1a; go&#xff1a;远程执行系统命令 Python&#xff1a;subprocess模块 Python-subprocess激…

代数结构基础 - 离散数学系列(八)

目录 1. 群&#xff08;Group&#xff09; 群的定义 群的示例 2. 环&#xff08;Ring&#xff09; 环的定义 环的示例 3. 域&#xff08;Field&#xff09; 域的定义 域的示例 域在密码学中的应用 4. 实际应用场景 1. 对称性与加密 2. 误差检测与纠正 3. 数据编码…

Maven介绍和使用

Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建Java项目的工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建。 依赖管理&#xff1a;方便快捷的管理项目依赖的资源包&#xff0c;避免…