lv7 嵌入式开发-网络编程开发 09 UDP通信

news2024/11/15 14:07:12

目录

1 用到的相关API

1.1 write/read到send/recv

1.2 sendto与recvfrom

2 UDP通信的实现过程

3 服务端代码、客户端、makefile代码实现


1 用到的相关API

1.1 write/read到send/recv

send函数原型:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

send() 函数用于在打开的网络套接字上发送数据。它的参数解释如下:

  • sockfd:需要发送数据的套接字文件描述符。
  • buf:发送缓冲区的指针,指向要发送的数据。
  • len:发送缓冲区中数据的大小,以字节为单位。
  • flags:标志参数,可以指定一些选项,例如发送模式等。在普通情况下,这个参数通常被设置为 0。

函数返回发送了的字节数,如果出错则返回 -1,并设置 errno 变量表示出错的原因。

recv函数原型:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

recv() 函数用于从打开的网络套接字上接收数据。它的参数解释如下:

  • sockfd:需要接收数据的套接字文件描述符。
  • buf:接收缓冲区的指针,用于存放接收到的数据。
  • len:接收缓冲区的大小,以字节为单位。
  • flags:标志参数,可以指定一些选项,例如接收模式等。在普通情况下,这个参数通常被设置为 0。

函数返回接收到的字节数,如果连接已关闭,则返回 0;如果出错则返回 -1,并设置 errno 变量表示出错的原因。

send/recv与read/write比较,前三个参数同,如果flag=0,那么send相当于write,recv相当于read

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

常见flags:

1. 一般设置为0
2. MSG_PEEK:窥视传入的数据。 数据被复制到缓冲区中,但不会从输入队列中删除。可以实现对数据进行预览操作,而不影响后续的接收。send() 函数中使用 MSG_PEEK 标志是无效的,因为该标志仅用于接收操作。
3. MSG_OOB:处理带外(OOB)数据。它会将指定的数据标记为带外数据,并发送给对方。带外数据是一种特殊类型的数据,在网络通信中具有高优先级,可以用于传输紧急或重要信息。需要注意的是,带外数据的发送和接收需要在套接字上启用相应的选项,即 SO_OOBINLINE。通过设置该选项可以决定是将带外数据与普通数据混合在一起接收(SO_OOBINLINE 选项未启用),还是将带外数据单独接收(SO_OOBINLINE 选项启用)。

1.2 sendto与recvfrom

1. 前四个参数同recv/send一样;

2. 后两个参数是通信结构体和结构体的宽度;

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
                 struct sockaddr *src_addr, socklen_t *addrlen);
  • sockfd 是接收数据的套接字文件描述符。
  • buf 是指向接收数据的缓冲区的指针。
  • len 是接收缓冲区的大小,以字节为单位。
  • flags 是标志参数,用于指定接收操作的选项,如MSG_WAITALLMSG_PEEK等。通常情况下将其设置为 0。
  • src_addr 是一个指向 struct sockaddr 类型的指针,用于返回发送方的地址信息。可以传入 NULL,表示不需要该信息。
  • addrlen 是一个指向 socklen_t 类型的指针,用于指定 src_addr 缓冲区的长度,并在函数调用后返回实际地址的长度。

该函数返回实际接收到的字节数,如果出现错误,则返回 -1,并设置 errno 变量来指示错误的原因。

recvfrom() 函数适用于 UDP 套接字和未连接的 TCP 套接字。对于已连接的 TCP 套接字,应使用 recv() 函数来接收数据。

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);
  • sockfd 是发送数据的套接字文件描述符。
  • buf 是指向要发送数据的缓冲区的指针。
  • len 是要发送的数据的长度,以字节为单位。
  • flags 是标志参数,用于指定发送操作的选项,如MSG_DONTROUTEMSG_MORE等。通常情况下将其设置为 0。
  • dest_addr 是一个指向 struct sockaddr 类型的指针,用于指定接收方的地址信息。对于面向连接的协议(如 TCP),可以将该参数设置为 NULL,表示使用之前已经建立的连接来发送数据。
  • addrlen 是指定 dest_addr 缓冲区的长度。

该函数返回实际发送的字节数,如果出现错误,则返回 -1,并设置 errno 变量来指示错误的原因。

sendto() 函数适用于 UDP 套接字和未连接的 TCP 套接字。对于已连接的 TCP 套接字,应使用 send() 函数来发送数据。在使用 sendto() 函数时,需要手动指定接收方的地址信息,因此需要在使用前预先获取该信息。

2 UDP通信的实现过程

3 服务端代码、客户端、makefile代码实现

提示:使用nc命令可以模拟udp客户端

nc -u 127.0.0.1 5000

udp-server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
	int fd;
	struct sockaddr_in addr;
	char buf[BUFSIZ] = {};

	fd = socket(AF_INET, SOCK_DGRAM, 0);
	if(fd == -1)
	{
		perror("socket");
		exit(0);
	}
	
	if(argc < 3)
	{
		printf("%s <ip><port>\n",argv[0]);
		exit(0);
	}

	memset(&addr, 0, sizeof(struct sockaddr_in));
	addr.sin_family = AF_INET;
	addr.sin_port = htons( atoi(argv[2])); 
	if(inet_aton(argv[1],&addr.sin_addr) == 0)
	{
		printf("Invalid address\b");
		exit(0);
	}

	if(bind(fd, (struct sockaddr*)&addr,sizeof(addr)) == -1)
	{
		perror("bind");
		exit(0);
	}

	while(1)
	{
		memset(buf,0,BUFSIZ);
		recvfrom(fd,buf,BUFSIZ,0,NULL, NULL);
		printf("buf=%s\n",buf);
	}
	close(fd);
	return 0;
}

 udp-client.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
	int fd;
	struct sockaddr_in addr;
	char buf[BUFSIZ] = {};
	socklen_t addrlen = sizeof(addr);


	fd = socket(AF_INET, SOCK_DGRAM, 0);
	if(fd == -1)
	{
		perror("socket");
		exit(0);
	}
	
	if(argc < 3)
	{
		printf("%s <ip><port>\n",argv[0]);
		exit(0);
	}

	memset(&addr, 0, sizeof(struct sockaddr_in));
	addr.sin_family = AF_INET;
	addr.sin_port = htons( atoi(argv[2])); 
	if(inet_aton(argv[1],&addr.sin_addr) == 0)
	{
		printf("Invalid address\b");
		exit(0);
	}
	
	while(1)
	{
		memset(buf,0,BUFSIZ);
		printf("input>");
		fgets(buf, BUFSIZ, stdin);
		sendto(fd,buf,strlen(buf),0,(struct sockaddr *)&addr, addrlen);
		printf("buf=%s\n",buf);
	}
	close(fd);
	return 0;
}

makefile

CC=gcc
CFLAGS=-Wall
all:udp-server udp-client

clean:
	rm udp-server udp-client

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

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

相关文章

Ubuntu MySQL

在安装前&#xff0c;首先看你之前是否安装过&#xff0c;如果安装过&#xff0c;但是没成功&#xff0c;就要先卸载。 一、卸载 1.查看安装 dpkg --list | grep mysql 有东西&#xff0c;就说明您之前安装过mysql。 2.卸载 先停掉server sudo systemctl stop mysql.servic…

基于回溯搜索优化的BP神经网络(分类应用) - 附代码

基于回溯搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于回溯搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.回溯搜索优化BP神经网络3.1 BP神经网络参数设置3.2 回溯搜索算法应用 4.测试结果…

基于Java的飞机航班订票购票管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

使用appscan定时批量扫描方法

文章目录 一、批量扫描设置二、定时扫描设置 一、批量扫描设置 appscan的窗口模式中允许用户一次只能选择一个扫描目标&#xff0c;但是如果想批量扫描多个网站的时候可以通过appscan安装文件夹下的AppScanCMD.exe工具来操作&#xff0c;具体操作如下。 首先按常规操作添加2个…

2.2.2搭建交叉编译器

1 交叉编译器 交叉编译的存在,有2个原因,1个是不同的平台,架构不同,使用的指令集不同,ARM和MIPS的CPU无法运行X86指令休编码的程序,1个是一般arm平台上的存储/性能有限,无法提供一个可靠的编译环境。所以就出现了在x86上编译,在arm上运行的镜像,即交叉编译。在交叉编…

git 同时配置 gitee github

git 同时配置 gitee github 1、 删除C:\Users\dell\.ssh目录。 在任意目录右击——》Git Bash Here&#xff0c;打开Git Bash窗口&#xff0c;下方命令在Git Bash窗口输入。 2、添加git全局范围的用户名和邮箱 git config --global user.email "609612189qq.com" …

【Spring篇】简述IoC入门案例,DI入门案例

&#x1f38a;专栏【Spring】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f384;Spring Framework系统架构&#x1f386;Spring核心概…

C10K问题:高并发模型设计

一、循环服务器模型 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> //*******// #include &l…

DeckGL MVTLayer+Mapbox注入shader实现简单效果

1.数据获取与处理 可以从OSM下载相应的带高度的矢量建筑物轮廓数据&#xff0c;下载后进行数据处理&#xff0c;保留高度字段&#xff0c;其他字段根据需求选择&#xff08;比如说想实现选中建筑物弹出相应建筑物的信息&#xff0c;就把这些信息字段保留下来&#xff09;&…

腾讯云2023年双十一优惠活动整理

随着双十一的到来&#xff0c;各大电商平台纷纷推出优惠活动。作为国内领先的云计算服务提供商&#xff0c;腾讯云自然也不会错过。以下是对腾讯云2023年双十一优惠活动的整理&#xff0c;希望能够帮助大家轻松上云&#xff01; 一、腾讯云双十一活动入口 直达腾讯云双十一活动…

使用Pytorch从零实现Vision Transformer

在这篇文章中,我们将基于Pytorch框架从头实现Vision Transformer模型,并附录完整代码。 Vision Transformer(ViT)是一种基于Transformer架构的深度学习模型,用于处理计算机视觉任务。它将图像分割成小的图像块(patches),然后使用Transformer编码器来处理这些图像块。V…

基于Java的剧本杀预约系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

2023年CSP-J真题详解+分析数据

目录 亲身体验 江苏卷 选择题 阅读程序题 阅读程序(1&#xff09; 判断题 单选题 阅读程序(2) 判断题 单选题 阅读程序(3) 判断题 单选题 完善程序题 完善程序(1) 完善程序(2) 2023CSP-J江苏卷详解 小结 亲身体验 2023年的CSP-J是在9月16日9:30--11:30进行…

x64内核实验3-页机制的研究(1)

x64内核实验3-页机制的研究&#xff08;1&#xff09; CR4寄存器 在白皮书的第三卷2.5章对控制寄存器有详细的介绍&#xff0c;下面是白皮书中CR寄存器的结构图&#xff08;这里要说明一下cr4的第12位是由被使用的这个位在2.5章的后半部分有介绍是控制是否开启5级分页的位否则…

[Spring] Spring5——JdbcTemplate 简介

目录 一、JdbcTemplate 概述 1、什么是 JdbcTemplate 2、准备运行环境 二、添加功能 1、示例 三、修改和删除功能 1、示例 四、查询功能 1、查询记录数 2、查询返回 bean 对象 3、查询返回集合 4、测试 五、批量增删改功能 1、批量添加 2、批量修改 3、批量删除…

Context应用上下文理解

文章目录 一、Context相关类的继承关系Context类ContextIml.java类ContextWrapper类ContextThemeWrapper类 二、 什么时候创建Context实例创建Context实例的时机 小结 Context类 &#xff0c;说它熟悉&#xff0c;是应为我们在开发中时刻的在与它打交道&#xff0c;例如&#x…

全方位介绍工厂的MES质量检验管理系统

一、MES质量检验管理系统的定义&#xff1a; MES质量检验管理系统是基于制造执行系统的框架和功能&#xff0c;专注于产品质量的控制和管理。它通过整合和优化质量检验流程&#xff0c;提供实时的数据采集、分析和反馈&#xff0c;帮助工厂实现高效的质量管理。该系统涵盖了从…

解决高分屏DPI缩放PC端百度网盘界面模糊的问题

第一步 更新最新版本 首先&#xff0c;在百度网盘官网下载最新安装包&#xff1a; https://pan.baidu.com/download 进行覆盖安装 第二步 修改兼容性设置 右键百度网盘图标&#xff0c;点击属性&#xff0c;在兼容性选项卡中点击更改所有用户的设置 弹出的选项卡中选择更改高…

linux内核分析:虚拟化

三种虚拟化方式 1. 对于虚拟机内核来讲&#xff0c;只要将标志位设为虚拟机状态&#xff0c;我们就可以直接在 CPU 上执行大部分的指令&#xff0c;不需要虚拟化软件在中间转述&#xff0c;除非遇到特别敏感的指令&#xff0c;才需要将标志位设为物理机内核态运行&#xff0c…

【gitlab】本地项目上传gitlab

需求描述 解决方法 下面的截图是gitlab空项目的描述 上传一个本地项目按其中“Push an existing folder”命令即可。 以renren-fast项目为例 # 用git bash 下载renren-fast项目 git clone https://gitee.com/renrenio/renren-fast.git# 在renren-fast的所属目录 打开git ba…