linux c UDP 应用

在 Linux C 语言环境下进行 UDP 通信时,您会使用多个标准的系统调用和函数来创建和管理 UDP 套接字。以下是一些在 UDP 通讯中常用的函数:

**socket()**:
创建套接字。对于 UDP 通信,第二个参数选择 SOCK_DGRAM

   int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

**bind()**:
把一个本地地址和端口号绑定到指定的套接字上。通常在服务端使用。

   bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

**connect()**(可选):
使套接字进入已连接状态,之后可以使用 send() 和 recv() 而不是 sendto() 和 recvfrom()。通常在客户端使用。

   connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

**sendto()**:
通过 UDP 套接字发送消息。可单独指定目标地址和端口号。

   sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));

**recvfrom()**:
从 UDP 套接字接收消息。可以获取发送方的地址信息。

在使用 UDP 协议进行通信时,一个数据报(packet)是整个独立的传输单位。当使用 recvfrom() 函数时,如果指定的缓冲区长度小于实际数据报的大小,超过缓冲区长度的部分将会丢失,不可恢复。

   recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&clientaddr, &len);

参数描述:

  • sockfd:接收数据的套接字描述符。
  • buf:指向一个缓冲区的指针,该缓冲区用于存储接收的消息。
  • len:缓冲区的长度,指定最大能接收的字节数。
  • flags:提供额外的控制消息接收方式的标志位,一般情况下设置为0。
  • src_addr:(可选)一个指向 sockaddr 结构的指针,该结构用于存储发送端的地址信息(如 IP 地址和端口号)。
  • addrlen:(可选)指向存储地址信息长度的变量,调用 recvfrom() 之前,它的值应该设置为 src_addr 指向的结构的大小,调用后,它会被设置为实际接收到地址结构的大小。

返回值:

  • 成功时:返回接收到的字节数,如果消息比指定的 len 参数长的话,会被截断,多出的字节会丢失。
  • 出错时:返回 -1,并设置 errno 以指示错误类型。
  • 连接已关闭:返回 0

注意:

  • recvfrom() 是阻塞调用,如果没有数据可读,调用者将会阻塞直到有数据到来。如果套接字是非阻塞的,没有数据可读会返回 -1 并且 errno 被设置为 EAGAIN 或 EWOULDBLOCK
  • 如果不关心发送端的地址信息,src_addr 和 addrlen 参数可以分别设置为 NULL 和 0
  • 该函数主要用于 UDP 协议,对于面向连接(如 TCP)的套接字,通常使用 recv()

**getaddrinfo()**:
返回一个结构体列表,内含地址信息。这个列表可以用来建立套接字和进行绑定操作。

   getaddrinfo(NULL, server_port, &hints, &servinfo);

**setsockopt()**:
设置套接字选项。可用于启用套接字的某些协议层的选项,例如设置广播权限。

   setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));

**close() 或 shutdown()**:
关闭套接字或停止套接字的部分或全部功能。

   close(sockfd);// orshutdown(sockfd, SHUT_RDWR);

**getsockname()**:
获取与套接字关联的本地地址信息,通常用于获取绑定到套接字的端口号

   getsockname(sockfd, (struct sockaddr *)&localaddr, &addrlen);

**fcntl()**:
设置套接字为非阻塞模式。

    fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK);

在使用这些函数之前,你应该包含相应的头文件,例如 <sys/socket.h><netinet/in.h><arpa/inet.h> 等。进行 UDP 通信的程序通常遵循创建套接字、绑定地址和端口、发送和接收数据包、关闭套接字的流程。

在进行实际编程时,请记得检查每个函数的返回值以处理可能的错误。此外,对于非阻塞通信或改进性能,你可能还需要使用高级技术,例如 I/O 多路复用(select、poll 或 epoll)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806520.shtml

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

相关文章

Scala - 函数柯里化(Currying)

柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。 实例 首先我们定义一个函数: def add(x:Int,y:Int)xy 那么我们应用的时候&#xff0c;应该是这样用&#xff1a;add(1,2) 现在我们把这…

Elasticsearch:从 ES|QL 到 PHP 对象

作者&#xff1a;来自 Elastic Enrico Zimuel 从 elasticsearch-php v8.13.0 开始&#xff0c;你可以执行 ES|QL 查询并将结果映射到 stdClass 或自定义类的 PHP 对象。 ES|QL ES|QL 是 Elasticsearch 8.11.0 中引入的一种新的 Elasticsearch 查询语言。 目前&#xff0c;它在…

数据可视化的3D问题

三维对象非常流行&#xff0c;但在大多数情况下会对解释图形的准确性和速度产生负面影响。 以下是对涉及 3d 的主要图形类型的回顾&#xff0c;并讨论了它们是否被认为是不好的做法。 1、3D 条形图&#xff1a;不要 这是一个 3d 条形图。 你可能很熟悉这种图形&#xff0c;因为…

软考120-上午题-【软件工程】-软件开发模型02

一、演化模型 软件类似于其他复杂的系统&#xff0c;会随着时间的推移而演化。在开发过程中&#xff0c;常常会面临以下情形&#xff1a;商业和产品需求经常发生变化&#xff0c;直接导致最终产品难以实现&#xff1b;严格的交付时间使得开发团队不可能圆满地完成软件产品&…

yolov8草莓及病害检测项目开发(python开发,带有训练模型,可以重新训练,并有Pyqt5界面可视化)

本次检测系统&#xff0c;可以通过图片、视频或摄像头三种形式检测&#xff0c;检测出开花、结果、熟果、草莓叶子健康、叶子缺钙、灰叶斑病等八大类别。基于最新的YOLO-v8模型&#xff0c;下载后即可重新运行训练脚本&#xff0c;&#xff0c;也可以直接运行检测脚本&#xff…

无人机低空数字摄影测量系统

一、 系统概述 系统完全基于IDL设计实现&#xff0c;包括界面布局到人机交互再到底层核心函数功能。整体设计框架基于数字摄影测量的专业处理流程&#xff0c;实现了数据输入、数据预处理、影像信息检测、空间定向、地形三维建模、专题信息提取、成果输出与更新等功能。同时为…

如何将powerpoint(PPT)幻灯片嵌入网页中在线预览、编辑并保存到服务器?

猿大师办公助手不仅可以把微软Office、金山WPS和永中Office的Word文档、Excel表格内嵌到浏览器网页中实现在线预览、编辑保存等操作&#xff0c;还可以把微软Office、金山WPS和永中Office的PPT幻灯片实现网页中在线预览、编辑并保存到服务器。 猿大师办公助手把本机原生Office…

Netty实现udp服务器

1、TCP与UDP通信协议 网络传输层协议有两种&#xff0c;一种是TCP&#xff0c;另外一种是UDP。 TCP是一种面向连接的协议&#xff0c;提供可靠的数据传输。TCP通过三次握手建立连接&#xff0c;并通过确认和重传机制&#xff0c;保证数据的完整性和可靠性。TCP适用于对数据准…

基于lora技术对Gemma(2B)大模型的微调实践

一、概述 本文主要基于Lora技术&#xff0c;在Google colab上用A100对Gemma 2B大模型进行了指令微调&#xff0c;第一次指令微调是采用databricks-dolly-15k 作为数据集&#xff0c;取得了不错的微调效果&#xff0c;能准确用英文回答问题&#xff0c;但databricks-dolly-15k …

001 spring ioc(xml)

文章目录 UserControllerUserMapperImplSchool.javaStudent.javaUserServiceImpl.javaApplicationContext.xmlUserControllerTest.javaStudentTest.javapom.xml UserController package com.aistart.controller;import com.aistart.pojo.Student; import com.aistart.service.U…

智慧公厕中的大数据、云计算和物联网技术引领未来公厕管理革命

现代社会对于公共卫生和环境保护的要求越来越高&#xff0c;智慧公厕作为城市基础设施建设的重要组成部分&#xff0c;正引领着公厕管理的革命。随着科技的不断进步&#xff0c;大数据、云计算和物联网技术的应用为智慧公厕带来了全新的可能性&#xff0c;&#xff08;ZonTree中…

Spring Boot统一功能处理之拦截器

本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求&#xff08;doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口&#xff0c;通常会安排几个…

selenium添加代理(有账号密码)

以下为各种尝试的记录&#xff0c;正确实现可直接参考最后一条&#xff01; 1&#xff0c;导入Proxy库来添加capabilities属性&#xff1a;可以访问网站&#xff0c;但ip还是本机ip from selenium import webdriver from selenium.webdriver.chrome.options import Options f…

【mT5多语言翻译】之四——加载:加载数据集与模型

请参考本系列目录&#xff1a;【mT5多语言翻译】之一——实战项目总览 [1] 加载数据集 在上一篇实战博客中&#xff0c;我们介绍了如何下载和预处理数据集&#xff0c;并且介绍了如何将数据集内的文本进行分词然后保存为pt文件。 接下来&#xff0c;我们讲解在模型训练时加载数…

【TensorRT】TensorRT C# API 项目更新 (1):支持动态Bath输入模型推理(下篇)

4. 接口应用 关于该项目的调用方式在上一篇文章中已经进行了详细介绍&#xff0c;具体使用可以参考《最新发布&#xff01;TensorRT C# API &#xff1a;基于C#与TensorRT部署深度学习模型》&#xff0c;下面结合Yolov8-cls模型详细介绍一下更新的接口使用方法。 4.1 创建并配…

Java零基础入门-Java反射机制

一、概述 我们都听说过java有个反射机制&#xff0c;通过反射机制我们可以更深入的控制程序的运行过程。例如&#xff0c;在程序进入到运行期间&#xff0c;由用户输入一个类名&#xff0c;然后我们可以动态获取到该类拥有的所有类结构、属性名和方法&#xff0c;甚至还可以任意…

sift 解释

转载 https://www.cnblogs.com/xc90/articles/11571995.html opensift code Rob Hess robwhess/opensift: Open-Source SIFT Library (github.com) 在构建图像尺度空间的过程中&#xff0c;唯一使用的核函数是高斯核&#xff0c;这一点被T Lindeber在文献《Scale-space th…

Java快速入门系列-9(Spring框架与Spring Boot —— 深度探索及实践指南)

第九章:Spring框架与Spring Boot —— 深度探索及实践指南 9.1 Spring框架概述9.2 Spring IoC容器9.3 Spring AOP9.4 Spring MVC9.5 Spring Data JPA/Hibernate9.6 Spring Boot快速入门与核心特性9.7 Spring Boot的自动配置与启动流程详解9.8 创建RESTful服务与数据库交互实践…

专为苹果系统设计的精美可视化图表 | 开源日报 No.219

danielgindi/Charts Stars: 27.3k License: Apache-2.0 Charts 是为 iOS/tvOS/OSX 提供美观图表的开源项目&#xff0c;是跨平台 MPAndroidChart 在苹果设备上的实现。该项目提供了以下主要功能和优势&#xff1a; 支持 iOS、tvOS 和 macOS 平台使用 Swift 编写&#xff0c;可…

Ceph学习 -6.Nautilus版本集群部署

文章目录 1.集群部署1.1 环境概述1.1.1 基础知识1.1.2 环境规划1.1.3 小结 1.2 准备工作1.2.1 基本环境1.2.2 软件安装1.2.3 小结 1.3 Ceph部署1.3.1 集群创建1.3.2 部署Mon1.3.3 小结 1.4 Ceph部署21.4.1 Mon认证1.4.2 Mgr环境1.4.3 小结 1.5 OSD环境1.5.1 基本环境1.5.2 OSD实…