UDP编程

article/2025/8/29 19:20:36

 udp是无连接的,没有listen 与 accept。

bind

服务端一定需要bind,告知别人自己的ip和port。

客户端可以不bind,在发送数据时候可以随机分配,客户端推荐bind(与tcp不同,udp本身无连接)。

注意:

  • 服务端当中另一个进程已经用tcp bind了 8080,该进程还可以使用udp bind 8080,tcp 与 udp没有关系。

udp只能使用sendto

sendto携带ip

如果客户端没有bind,那么只能由客户端sendto

udp接收消息只能使用recvfrom

可以获取发送方的ip和port

udp 中的close

由于无连接,另一端无影响(另一端不知道对方断开连接)。

如果一端已经close了,对面继续sendto,消息丢失不重传,可以在应用层实现可靠性。

如果一端已经close了,对面继续recvfrom,一直阻塞。

udp 和 tcp 的区别

udp 不可靠,无连接,消息有边界

tcp 可靠,有连接,是一种流式协议,消息无边界

使用udp实现即时聊天

尽管传输层没有建立连接,但是我们在应用层实现了。在做聊天之前,需要客户端先发一条消息给服务端,让服务端知道客户端的ip 和 port。

退出时可以利用recvfrom的返回值,在udp中,如果recvfrom的返回值为0,说明是空包,对面已经退出,此时本方可以退出。

代码实现

server_udp.c

#include <my_header.h>
#define BUFSIZE 4096
/* Usage:  */
int main(int argc, char *argv[]){                                  ARGS_CHECK(argc,3);int sockfd = socket(AF_INET,SOCK_DGRAM,0);struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(argv[1]);addr.sin_port = htons(atoi(argv[2]));int ret = bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));ERROR_CHECK(ret,-1,"bind");char buf[BUFSIZE];struct sockaddr_in clientAddr;socklen_t clientAddrlen = sizeof(clientAddr);recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&clientAddr,&clientAddrlen);printf("client connected! ip = %s, port = %d, [buf] %s\n",inet_ntoa(clientAddr.sin_addr),htons(clientAddr.sin_port),buf);fd_set fd;while(1){FD_ZERO(&fd);FD_SET(STDIN_FILENO,&fd);FD_SET(sockfd,&fd);select(sockfd+1,&fd,NULL,NULL,NULL);if(FD_ISSET(sockfd,&fd)){bzero(buf,sizeof(buf));ssize_t sret = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&clientAddr,&clientAddrlen);if(sret == 0){printf("client disconnected\n");break;}printf("[buf] %s\n",buf);}if(FD_ISSET(STDIN_FILENO,&fd)){bzero(buf,sizeof(buf));ssize_t sret = read(STDIN_FILENO,buf,sizeof(buf));if(sret == 0){printf("server disconnected\n");sendto(sockfd,buf,0,0,(struct sockaddr*)&clientAddr,clientAddrlen);break;}sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&clientAddr,clientAddrlen);}}close(sockfd);return 0;
}

client_udp.c

#include <my_header.h>
#define BUFSIZE 4096
/* Usage:  */
int main(int argc, char *argv[]){                                  ARGS_CHECK(argc,3);int sockfd = socket(AF_INET,SOCK_DGRAM,0);struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(argv[1]);addr.sin_port = htons(atoi(argv[2])); socklen_t serverlen = sizeof(addr);sendto(sockfd,"nihao",5,0,(struct sockaddr *)&addr,sizeof(addr));char buf[BUFSIZE];fd_set fd;while(1){FD_ZERO(&fd);FD_SET(STDIN_FILENO,&fd);FD_SET(sockfd,&fd);select(sockfd+1,&fd,NULL,NULL,NULL);if(FD_ISSET(sockfd,&fd)){bzero(buf,sizeof(buf));ssize_t sret = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&addr,&serverlen);if(sret == 0){printf("server disconnected\n");break;}printf("[buf] %s\n",buf);}if(FD_ISSET(STDIN_FILENO,&fd)){bzero(buf,sizeof(buf));ssize_t sret = read(STDIN_FILENO,buf,sizeof(buf));if(sret == 0){printf("I will close connection\n");sendto(sockfd,buf,0,0,(struct sockaddr*)&addr,sizeof(addr));break;}sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr));}}close(sockfd);return 0;
}

服务端回复消息,服务端先recvfrom获取ip和ort,随后就可以sendto回去了。

对比tcp与udp来说,tcp操作更简单。但是udp的性能更好,在音视频等领域应用更广。


http://www.hkcw.cn/article/HRTsehWIic.shtml

相关文章

【计网】分片

MF DF MAC帧 MTU 首部数据载荷 片偏移是整数

记录一个梦,借助大语言模型图片生成

梦见家门口有一条大河&#xff0c;但大河和其它景物都是灰暗没有鲜艳色彩很普通的梦中场景。大河似乎是长江的支流&#xff0c;但也可能有一个响亮的名字似乎是金沙江。 突然看到一条金红色的龙在快速游动&#xff0c;不敢相信自己的眼睛&#xff0c;因为一直不相信有这种生物…

PostgreSQL查询一个表的数据

要从一个表中检索数据就是按要求查询表的信息&#xff0c;。SQL的SELECT语句可分为&#xff1a; 1.选择列表&#xff08;选择查询返回的列&#xff09; 2.表列表操作&#xff08;从中查询出的数据&#xff0c;进一步进行加减乘除-*/、筛选等操作&#xff09; 3.可选的条件 whe…

聊聊后端面试中的MySQL高频考题

如大家所了解的&#xff0c;SQL&#xff08; Structured Query Language &#xff09;是一门在开发者中使用覆盖率超50%的数据库结构化查询语言。 不可否认&#xff0c;无论是常年与数据打交道的数据分析师和数据科学家&#xff0c;经常需要管理和维护数据库的数据库管理员&am…

R3GAN利用配置好的Pytorch训练自己的数据集

简介 简介:这篇论文挑战了"GANs难以训练"的广泛观点,通过提出一个更稳定的损失函数和现代化的网络架构,构建了一个简洁而高效的GAN基线模型R3GAN。作者证明了通过合适的理论基础和架构设计,GANs可以稳定训练并达到优异性能。 论文题目:The GAN is dead; long l…

【python深度学习】Day 39 图像数据与显存

知识点 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容即可 一、图像数据的介绍 结构化数据&#xff08;如表…

mongodb源码分析session接受客户端find命令过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制。 现在继续研究ASIOSession和connection是怎么接受客户端命令的&#xff1f; mongo/transport/service_state_machine.cpp核心方法有&#xf…

酒店管理破局:AI 引领智能化转型

一、酒店行业现状&#xff1a;规模扩张加速与效率瓶颈并存 根据中国五矿证券《中国酒店行业格局分析》报告&#xff0c;国内酒店行业呈现头部集中化趋势。截至2024年第三季度&#xff0c;锦江酒店以13,186家门店、125.8万间客房的规模稳居行业第一[1]。华住集团则以178.68亿元…

大模型深度学习之双塔模型

前言 双塔模型&#xff08;Two-Tower Model&#xff09;是一种在推荐系统、信息检索和自然语言处理等领域广泛应用的深度学习架构。其核心思想是通过两个独立的神经网络&#xff08;用户塔和物品塔&#xff09;分别处理用户和物品的特征&#xff0c;并在共享的语义空间中通过相…

【Java Web】速通CSS

参考笔记:JavaWeb 速通CSS_java css-CSDN博客 目录 一、CSS入门 1. 基本介绍 2. 作用 二、CSS的3种引入方式 1. 行内式 1.1 示例代码 1.2 存在问题 2. 写在head标签的style子标签中 2.1 示例代码 2.2 存在问题 3.以外部文件的形式引入(开发中推荐使用)⭐⭐⭐ 3.1 说明 3…

PostgreSQL安装

我们使用开源的对象关系型数据库--PostgreSQL&#xff0c;它具有高性能、可扩展和支持复杂查询的特性&#xff0c;非常适合现在学习使用。 一.安装PostgreSQL 我用的windows&#xff0c;就在windows上安装。 1.首先访问 PostgreSQL 官方网站https://www.postgresql.org/dow…

C++:栈帧、命名空间、引用

一、前置知识 1.1、栈区&#xff08;Stack&#xff09; 1.1.1、内存分配与回收机制 分配方式​​&#xff1a;由编译器自动管理&#xff0c;通过调整栈指针&#xff08;ESP/RSP&#xff09;实现。 函数调用时&#xff0c;栈指针下移&#xff08;栈从高地址向低地址增长&…

【HarmonyOS 5】鸿蒙应用px,vp,fp概念详解

【HarmonyOS 5】鸿蒙应用px&#xff0c;vp&#xff0c;fp概念详解 一、前言 目前的鸿蒙开发者&#xff0c;大多数是从前端或者传统移动端开发方向&#xff0c;转到鸿蒙应用开发方向。 前端开发同学对于开发范式很熟悉&#xff0c;但是对于工作流程和开发方式是会有不适感&am…

[Rust_1] 环境配置 | vs golang | 程序运行 | 包管理

目录 Rust 环境安装 GoLang和Rust 关于Go 关于Rust Rust vs. Go&#xff0c;优缺点 GoLang的优点 GoLang的缺点 Rust的优点 Rust的缺点 数据告诉我们什么&#xff1f; Rust和Go的主要区别 (1) 性能 (2) 并发性 (3) 内存安全性 (4) 开发速度 (5) 开发者体验 Ru…

Codeforces Round 1024 (Div. 2)

Problem - A - Codeforces 思维题&#xff1a; 如果n不能整除p&#xff0c;就会多出一部分&#xff0c;这个部分可以作为调和者&#xff0c;使整个数组符合要求。 如果n能整除p&#xff0c;没有调和空间&#xff0c;只有看n/p*qm 来看代码&#xff1a; #include <bits/s…

【东枫科技】KrakenSDR 天线阵列设置

标准测向需要五根相同的全向天线。您可以折衷使用更少的天线&#xff0c;但为了获得最佳性能&#xff0c;我们建议使用全部五根天线。这些天线通常是磁铁安装的鞭状天线&#xff0c;或偶极子天线。我们建议始终使用均匀圆形阵列 (UCA) 天线&#xff0c;因为它可以确定来自各个方…

包含Javascript的HTML静态页面调取本机摄像头

在实际业务开发中&#xff0c;需要在带有摄像头的工作机上拍摄施工现场工作过程的图片&#xff0c;然后上传到服务器备存。 这便需要编写可以运行在浏览器上的代码&#xff0c;并在代码中实现Javascript调取摄像头、截取帧保存为图片的功能。 为了使用户更快掌握JS调取摄像头…

2023年6月第三套第二篇

找和脑子有关系的rather than 不是的意思&#xff0c;不用看 instead表示递进的解释 even when即使不重要&#xff0c;看前方主句 d选项是even when和前方主句的杂糅&#xff0c;往往是错的 instead of 而不是 这道题&#xff0c;有的人觉得避免模仿这时候你会笑&#xff0c;所…

Redis的大Key问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【Redis的大Key问题如何解决&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis的大Key问题如何解决&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis中的“大Key”问题是指某个键的值占用了过多…

magic-api配置Git插件教程

一、配置gitee.com 1&#xff0c;生成rsa密钥&#xff0c;在你的电脑右键使用管理员身份运行&#xff08;命令提示符&#xff09;&#xff0c;执行下面命令 ssh-keygen -t rsa -b 2048 -m PEM一直按回车键&#xff0c;不需要输入内容 找到 你电脑中的~/.ssh/id_rsa.pub 文件…