当前位置: 首页 > news >正文

网络编程——UDP编程

UDP编程

  • UDP编程步骤
  • 通信流程
    • server
    • client
  • 函数接口
    • socket
    • bind
    • recvfrom
    • sendto
  • 举例
    • UDP客户端
    • UDP服务器

UDP编程步骤

在这里插入图片描述
在C语言中进行UDP编程的一般步骤如下:

(1)包含头文件
在代码中包含必要的头文件,以便使用UDP编程所需的函数和数据类型。通常情况下,你需要包含 <sys/socket.h>、<netinet/in.h> 和 <arpa/inet.h>。

(2)创建套接字
使用 socket() 函数创建一个套接字,该套接字将用于网络通信。套接字是一个整数值,它表示一个打开的文件描述符,用于在网络上发送和接收数据。

(3)设置地址和端口
创建一个 struct sockaddr_in 结构体,并设置其中的成员变量,包括地址和端口号。这个结构体用于指定服务器的地址和端口。

(4)绑定套接字
使用 bind() 函数将套接字绑定到指定的地址和端口上。这将使服务器能够接收通过该地址和端口发送的UDP数据报。

(5)接收数据
使用 recvfrom() 函数从绑定的套接字接收数据报。该函数将阻塞等待,直到接收到数据报为止。

(6)发送数据
使用 sendto() 函数向特定的目标地址发送数据报。该函数需要指定目标地址和端口,以及要发送的数据。

(7)关闭套接字
在通信结束后,使用 close() 函数关闭套接字,释放资源。

这些步骤提供了一个基本的框架来进行UDP编程。你可以根据需要进行适当的修改和扩展。同时还需要处理错误和异常情况,并确保适当地释放资源,以避免内存泄漏和其他问题。请注意,UDP是面向无连接的协议,因此不需要像TCP那样建立连接和维护状态。每个UDP数据报都是独立的,它们可以单独发送和接收。
在这里插入图片描述

通信流程

server

(1)创建数据报套接字(socket(,SOCK_DGRAM,))
(2)绑定网络信息(bind())
(3)接收信息(recvfrom())
(4)关闭套接字(close())

client

(1)创建数据报套接字(socket())
(2)指定服务器的网络信息
(3)发送信息(sendto())
(4)关闭套接字(close())

函数接口

socket

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain,int type,int protocol);功能:创建套接字文件  参数:domain:协议族 ,选择通信方式AF_UNIX, AF_LOCAL   本地通信AF_INET             IPv4 AF_INET6            IPv6  type:通信协议-套接字类型SOCK_STREAM   流式套接字SOCK_DGRAM    数据报套接字SOCK_RAW      原始套接字protocol:协议  填0,自动匹配底层TCP或UDP等协议。根据type匹配系统默认自动帮助匹配对应协议传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)返回值:成功。返回同于链接的文件描述符失败 -1,更新errno

bind

```c
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);功能:绑定套接字 - ip和端口功能:sockfd:套接字文件描述符addr:用于通信结构体 (提供的是通用结构体,需要根据选择通信方式,填充对应结构体-通信结构体由socket第一个参数确定)addrlen:结构体大小
返回值: 成功0失败:-1 更新errno通用结构体:  
struct sockaddr{sa_family_t sa_family;char        sa_data[14];
}ipv4的通信结构体:
struct sockaddr_in{sa_family_t    sin_family;/*AF_INET */in_port_t      sin_port;/* 端口 */struct in_addr sin_addr;/* ip地址 */
};
struct in_addr{uint32_t       s_addr;
};本地通信结构体:
struct sockaddr_un{sa_family_t sun_family;/* AF_UNIX */char        sun_path[108];/* 套接字文件 */
};

recvfrom

ssize_t recvfrom(int sockfd,void*buf,size_t len,int flags,struct sockaddr * src_addr,socklen_t * addrlen);
功能:接收数据参数:sockfd:套接字描述符buf:接收缓存区的首地址len:接收缓存区的大小flags:0//调用方式标志位src_addr:发送端的网络信息结构体的指针addrlen:发送端的网络信息结构体的大小的指针返回值:成功接收的字节个数失败:-10:客户端退出

sendto

ssize_t sendto(int sockfd,constvoid*buf,size_t len,int flags,
const struct sockaddr* dest_addr,socklen_t addrlen);
功能:发送数据参数:sockfd:套接字描述符buf:发送缓存区的首地址len:发送缓存区的大小flags:0src_addr:接收端的网络信息结构体的指针addrlen:接收端的网络信息结构体的大小返回值: 成功发送的字节个数失败:-1

举例

UDP客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define MAX_BUFFER_SIZE 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888int main() {int sockfd;struct sockaddr_in server_addr;char buffer[MAX_BUFFER_SIZE];// 创建UDP套接字if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}memset(&server_addr, 0, sizeof(server_addr));// 设置服务器地址和端口server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);server_addr.sin_port = htons(SERVER_PORT);// 从标准输入读取数据printf("Enter message: ");fgets(buffer, MAX_BUFFER_SIZE, stdin);// 发送数据到服务器sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));// 等待接收服务器的响应memset(buffer, 0, sizeof(buffer));recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);// 打印服务器的响应printf("Server response: %s\n", buffer);// 关闭套接字close(sockfd);return 0;
}

UDP服务器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define MAX_BUFFER_SIZE 1024
#define SERVER_PORT 8888int main() {int sockfd;struct sockaddr_in server_addr, client_addr;char buffer[MAX_BUFFER_SIZE];// 创建UDP套接字if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}memset(&server_addr, 0, sizeof(server_addr));memset(&client_addr, 0, sizeof(client_addr));// 设置服务器地址和端口server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(SERVER_PORT);// 绑定服务器地址和端口if (bind(sockfd, (const struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}printf("Server running on port %d...\n", SERVER_PORT);while (1) {// 接收来自客户端的数据memset(buffer, 0, sizeof(buffer));socklen_t client_len = sizeof(client_addr);ssize_t message_size = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&client_addr, &client_len);if (message_size < 0) {perror("recvfrom failed");exit(EXIT_FAILURE);}// 打印客户端发送的数据printf("Client message: %s\n", buffer);// 向客户端发送响应if (sendto(sockfd, buffer, message_size, 0, (struct sockaddr*)&client_addr, sizeof(client_addr)) < 0) {perror("sendto failed");exit(EXIT_FAILURE);}}// 关闭套接字close(sockfd);return 0;
}

相关文章:

网络编程——UDP编程

UDP编程 UDP编程步骤通信流程serverclient 函数接口socketbindrecvfromsendto 举例UDP客户端UDP服务器 UDP编程步骤 在C语言中进行UDP编程的一般步骤如下&#xff1a; &#xff08;1&#xff09;包含头文件&#xff1a; 在代码中包含必要的头文件&#xff0c;以便使用UDP编程所…...

linux内核篇-进程及其调度

介绍一个程序从源文件到进程执行的过程 1、编译链接&#xff08;源文件到二进制文件&#xff09; Linux 下面二进制的程序也要有严格的格式&#xff0c;称为ELF&#xff08;Executeable and Linkable Format&#xff0c;可执行与可链接格式&#xff09; &#xff0c;这个格式可…...

C#开发的OpenRA游戏之基地工程车执行部署命令

C#开发的OpenRA游戏之基地工程车执行部署命令 前面已经分析接收到网络命令后,可以拿到多个命令对象, 通过命令对象进行遍历,最终会在比较部署命令的类里相同,从而执行部署命令。 可见,网络游戏里的对象操作,都是通过网络发送给服务器,再从服务器返回消息来执行对象的动…...

米哈游的春招实习面经,问的很基础

米哈游的春招实习面经&#xff0c;主要考察了java操作系统mysql网络&#xff0c;这四个方面。 面试流程&#xff0c;共1小时&#xff0c;1min自我介绍&#xff0c;20min写题&#xff0c;剩下问题基础知识。 Java String&#xff0c;StringBuilder&#xff0c; StringBuffer区…...

pro如何添加定时任务

Pro v2.4版本开始后台可以开关控制定时任务&#xff0c;那如何添加新的定时任务呢&#xff1f; 第一步&#xff1a;设置定时任务名称及标识&#xff1b; 文件app\controller\admin\v1\system\SystemTimer中task_name()方法 /**定时任务名称及标识 * return mixed */ public fu…...

bgp路由策略

* - valid 有效的, > - best 最佳的 上图中&#xff0c;有*和>&#xff0c;是有效最佳的。而没有*和没有>&#xff0c;是无效的&#xff0c;下一跳不可达 1--64511是公有AS 64512-65534为私有AS //属于哪个大的联盟 AS200 //连着一个子类AS 65002 //和子…...

chatGPT4.0编写性能测试报告

性能测试报告 测试概述 本次性能测试的目的是评估系统在高负载条件下的性能表现&#xff0c;以确保系统能够满足预期的性能需求。测试过程中&#xff0c;我们关注以下性能指标&#xff1a;响应时间、吞吐量、资源利用率&#xff08;CPU、内存、磁盘、网络&#xff09;以及错误…...

jpa多线程事务

百度都百度不到jpa多线程的事务回滚&#xff0c;废话少说&#xff0c;就是干&#xff0c; 实现思路&#xff08;可看可不看&#xff0c;本人也不喜欢罗里吧嗦的&#xff0c;想直接看干货就跳过这里&#xff0c;直接执行代码&#xff09;&#xff1a; jpa本身是不支持多线程事务…...

加密解密软件VMProtect教程(四):准备项目之SDK功能

VMProtect 是保护应用程序代码免遭分析和破解的可靠工具&#xff0c;但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。 SDK 功能可以集成到受保护应用程序的源代码中&#xff0c;以设置受保护区域的边界&#xff0c;以检测调…...

夏令营教育小程序开发功能和优势有哪些?

随着人们生活水平的提高&#xff0c;对于孩子的教育问题也是越来越重视&#xff0c;无论是教育方式还是教育内容上都追求新颖、多样化。在暑假期间&#xff0c;很多家长也希望孩子能够在这个长假期之间参加一些活动&#xff0c;培养孩子兴趣的同时也丰富假期内容&#xff0c;让…...

Cocos CreatorXR 1.2.0 今日发布,正式支持 WebXR ,并开启 MR 之路

去年九月&#xff0c;Cocos CreatorXR v1.0.1 版本支持了 VR 内容创作&#xff0c;成为率先支持 XR 的国产引擎&#xff0c;今年三月&#xff0c;Cocos CreatorXR v1.1.0 版本实现了对 AR 内容开发的支持。在完成基本功能的建设后&#xff0c;更多开发者开始尝试使用 Cocos Cre…...

Linux 使用笔记(本人出品,必属精品)

文章目录 Part.I IntroductionChap.I 快应用Chap.II 课程所学 Part.II 基础知识Chap.X 杂记 Part.I Introduction Linux 是笔者在大四上学期学的&#xff0c;当时授课的刘老师现在还能偶尔见到。但是平时一般用 Windows&#xff0c;有机会接触 Linux 一般是偶尔在服务器上跑跑程…...

【2023 · CANN训练营第一季】初识新一代开发者套件 Atlas 200I DK A2 第二章——安装Atlas 200I DK A2跑通第一个案例

准备相关软件 包括一台PC机&#xff08;空间大于10g)&#xff0c;读卡器&#xff0c;32gsd卡&#xff0c;一根网线。 具体步骤&#xff1a; 开始烧录开发板镜像&#xff1a;将sd卡插入读卡器&#xff0c;将读卡器插入PC机的USB接口&#xff0c;根据相关链接在PC机下载制卡工具…...

concurrenthashmap

SizeCtl的用法 sizeCtl0或容量大小 &#xff08;二个构造方法&#xff09; sizeCtl>0&#xff08;初始化或扩容后&#xff09;扩容阈值 sizeCtl-1&#xff1a;正在初始化中 sizeCtl<-1&#xff1a;线程扩容中 知道为什么第一个线程扩容时2&#xff0c;后面的其他线程扩容…...

8年测试总结,项目/团队如何做自动化测试?效率价值?吐血整理...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…...

图像动态裁剪

1. 背景 以两级级联模型为例&#xff0c;第一级目标检测模型用于检测人员&#xff0c;第二级目标检测模型用于检测手机、对讲机等。然后实际数据采集过程中&#xff0c;手机、对讲机这些设备并不在人员的一级检测框内&#xff0c;使得二级模型训练的样本较少。 二级目标检测模…...

Thematica: 炫彩主题与黑暗奇观的Vue3之旅

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、介绍1.1 博客主题和目的1.2 Vue 3简介二、炫彩主题2.1 准备工作2.2 安装必要依赖2.3 创建Vue项目2.4 设置全局样式...

平凡的Python为什么能一跃成为世界排名第一的语言

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;大周|慕课网讲师 一、前言 本文将结合个人经历为各位同学客观的分析是否有学习Python的必要、Python适合谁学、为什么…...

Wijmo 2023 v1 Crack

改进了 FlexGrid&#xff0c;支持 React 18 严格模式和可访问性。 5月 15&#xff0c; 2023 - 10&#xff1a;51 新版本 特征 改进了对 React 18 的支持 - 添加了对 React 18 严格模式的支持&#xff0c;可帮助开发人员在开发过程中查找常见错误。辅助功能改进 - 以下是此版本中…...

万物互联时代的边缘计算安全需求与挑战

随着物联网技术的快速发展&#xff0c;越来越多的设备和应用程序开始互联&#xff0c;这不仅提高了我们的生活质量&#xff0c;也带来了很多新的安全威胁。边缘计算作为连接数据和应用程序的关键环节&#xff0c;在万物互联的时代变得尤为重要。本文将讨论万物互联背景下的边缘…...

告别沉浸式白屏!UniApp中iOS/Android底部安全区与顶部状态栏颜色自定义全攻略

告别沉浸式白屏&#xff01;UniApp中iOS/Android底部安全区与顶部状态栏颜色自定义全攻略当开发者尝试在UniApp中实现沉浸式设计时&#xff0c;往往会遇到一个令人头疼的问题——默认的白色安全区和状态栏导致界面元素&#xff08;如电池图标、信号强度&#xff09;几乎不可见。…...

Transient、QuickEye、VerifyEye傻傻分不清?一文讲透Ansys里三种眼图仿真方法的适用场景与避坑指南

Transient、QuickEye、VerifyEye深度解析&#xff1a;Ansys眼图仿真技术选型实战指南 在高速数字系统设计中&#xff0c;眼图分析是评估信号完整性的黄金标准。面对Ansys工具链中三种截然不同的眼图生成方法&#xff0c;工程师常常陷入选择困境——是追求精确度的传统瞬态分析&…...

GEO生成引擎优化:当AI成为信息分发的主角,品牌如何抢占对话窗口?

当用户不再"搜索-浏览"&#xff0c;而是直接"AI提问-获取答案"&#xff0c;传统SEO的逻辑正在被彻底改写。2026年&#xff0c;GEO&#xff08;Generative Engine Optimization&#xff0c;生成式引擎优化&#xff09;已经从概念走向规模化落地。本文从技术…...

计算机视觉的实战项目:从0到1搭建属于自己的图像识别系统

作为软件测试从业者&#xff0c;我们每天都在和各类功能验证、兼容性测试、自动化测试框架打交道&#xff0c;对AI领域的实战项目往往觉得“门槛高”“和日常工作不沾边”。但随着AI技术在互联网产品中的落地越来越深入&#xff0c;图像识别功能已经成为很多APP、智能硬件的核心…...

Diablo Edit2:3步掌握暗黑破坏神2存档修改的终极秘籍

Diablo Edit2&#xff1a;3步掌握暗黑破坏神2存档修改的终极秘籍 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 还在为暗黑破坏神2中刷装备的漫长过程感到疲惫吗&#xff1f;Diablo Edit2这款免费…...

忆阻储层计算:预处理优化与硬件实现

1. 项目概述在当今人工智能快速发展的时代&#xff0c;神经形态计算正成为突破传统冯诺依曼架构瓶颈的重要方向。储层计算&#xff08;Reservoir Computing&#xff0c;RC&#xff09;作为一种特殊的循环神经网络架构&#xff0c;因其仅需训练输出层而显著降低了计算开销&#…...

完整解决方案:PL2303 Windows 10驱动快速安装指南

完整解决方案&#xff1a;PL2303 Windows 10驱动快速安装指南 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 如果你正在Windows 10系统上使用PL-2303HXA或PL-2303XA芯…...

收藏2026版|大模型应用开发入门全攻略,小白程序员转行AI避坑学习指南

打算踏入大模型领域、转行AI赛道的新手与程序员&#xff0c;正式规划学习路径前&#xff0c;务必先吃透AI应用开发工程师的岗位定位与工作内容。清晰认知岗位核心价值&#xff0c;才能规避无效学习&#xff0c;精准找准发力方向。2026年大模型技术全面迈入商业化落地阶段&#…...

VMware Workstation Pro 17许可证密钥:技术深度解析与最佳实践指南

VMware Workstation Pro 17许可证密钥&#xff1a;技术深度解析与最佳实践指南 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major versions…...

跟着 MDN 学CSS day_16:(深入掌握背景与边框的艺术)

在网页设计的视觉语言中&#xff0c;背景与边框是两个最基础也最强大的工具。它们就像舞台的幕布和画框&#xff0c;共同构建了元素的视觉边界与氛围。MDN的技能测试为我们提供了一个绝佳的实践机会&#xff0c;通过两个具体任务&#xff0c;将理论知识转化为实战能力。本文将深…...