【网络编程开发】6.UDP通信

6.UDP通信

UDP实现框架

在这里插入图片描述

send 函数

  1. 原型

    #include <sys/socket.h>
    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    
  2. 功能send 函数的主要功能是向指定的套接字发送数据。

  3. 参数

    • sockfd:一个有效的套接字描述符,表示要发送数据的套接字。
    • buf:指向要发送数据的缓冲区的指针。
    • len:要发送的数据的长度。
    • flags:一组标志,一般设置为0,用于控制发送行为。常用的标志包括:
      • MSG_CONFIRM:请求确认消息已成功发送。
      • MSG_DONTROUTE:不查找路由表,直接发送数据包。
      • MSG_DONTWAIT:非阻塞模式发送数据。
      • MSG_EOR:指示发送方已完成发送操作。
      • MSG_OOB:发送带外数据。
      • MSG_NOSIGNAL:在发送过程中忽略信号。
  4. 返回值

    • 如果成功发送数据,则返回实际发送的字节数。
    • 如果发生错误,则返回-1。

recv 函数

  1. 原型

    #include <sys/socket.h>
    ssize_t recv(int sockfd, void *buf, size_t len, int flags);   
    
  2. 功能recv 函数的主要功能是从指定的套接字接收数据。

  3. 参数

    • sockfd:一个有效的套接字描述符,表示要接收数据的套接字。
    • buf:指向用于存储接收到的数据的缓冲区的指针。
    • len:缓冲区的大小,即可以接收的最大字节数。
    • flags:一组标志,一般设置为0,用于控制接收行为。常用的标志包括:
      • MSG_PEEK:查看数据而不从输入队列中移除。
      • MSG_DONTWAIT:非阻塞模式接收数据。
      • MSG_TRUNC:返回截断的数据。
  4. 返回值

    • 如果成功接收数据,则返回实际接收的字节数。
    • 如果发生错误,则返回-1。

sendto 函数

  1. 原型

    #include <sys/socket.h>
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);   
    
  2. 功能sendto 函数的主要功能是将数据发送到指定的网络地址

  3. 参数

    • sockfd:一个有效的套接字描述符,表示要发送数据的套接字。
    • buf:指向要发送数据的缓冲区的指针。
    • len:要发送的数据的长度。
    • flags:一组标志,一般设置为0,用于控制发送行为。常用的标志包括:
      • MSG_CONFIRM:请求确认消息已成功发送。
      • MSG_DONTROUTE:不查找路由表,直接发送数据包。
      • MSG_DONTWAIT:非阻塞模式发送数据。
      • MSG_EOR:指示发送方已完成发送操作。
      • MSG_OOB:发送带外数据。
      • MSG_NOSIGNAL:在发送过程中忽略信号。
    • dest_addr:指向目标地址结构的指针,用于指定接收方的网络地址。
    • addrlen:目标地址结构的大小。
  4. 返回值

    • 如果成功发送数据,则返回实际发送的字节数。
    • 如果发生错误,则返回-1。

recvfrom 函数

  1. 原型

    #include <sys/socket.h>
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);   
    
  2. 功能recvfrom 函数的主要功能是从指定的套接字接收数据,并返回发送方的网络地址

  3. 参数

    • sockfd:一个有效的套接字描述符,表示要接收数据的套接字。
    • buf:指向用于存储接收到的数据的缓冲区的指针。
    • len:缓冲区的大小,即可以接收的最大字节数。
    • flags:一组标志,一般设置为0,用于控制接收行为。常用的标志包括:
      • MSG_PEEK:查看数据而不从输入队列中移除。
      • MSG_DONTWAIT:非阻塞模式接收数据。
      • MSG_TRUNC:返回截断的数据。
    • src_addr:指向源地址结构的指针,用于存储发送方的网络地址。
    • addrlen:源地址结构的大小。
  4. 返回值

    • 如果成功接收数据,则返回实际接收的字节数。
    • 如果发生错误,则返回-1。

nc 命令

  1. 格式nc [options] [hostname] [port]
  2. 功能
    • 监听入站连接:通过指定一个端口,nc可以作为服务器监听来自客户端的连接请求。
    • 连接远程系统:nc可以主动连接到远程主机的指定端口,建立一个TCP或UDP连接。
    • 连接UDP端口:与TCP类似,nc也支持通过UDP协议连接到远程端口。
    • 作为聊天工具:nc可以用来在两台机器之间建立一个简单的聊天环境。
    • 作为代理:nc可以被用作代理,转发数据到另一个网络地址。
  3. 参数
    • -l:监听模式,用于接收连接请求。
    • -p:指定本地端口号。
    • -u:使用UDP协议进行连接。
    • -v:显示详细的连接信息。
    • -w:设置超时时间(以秒为单位)。
    • -z:扫描远程主机的端口是否开放。
  4. 示例
    • 监听入站连接:nc -l 8080
    • 连接远程系统:nc example.com 8080
    • 连接UDP端口:nc -u example.com 53
    • 作为聊天工具:nc -l 8080 | nc example.com 8080
    • 作为代理:nc -l 8080 | nc example.com 8080

示例-服务端

udp_sever.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

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

  /*主函数传参*/
  if(argc < 3){
      fprintf(stderr, "%s<addr><port>\n", argv[0]);
      exit(EXIT_FAILURE);
  }

  /*创建套接字*/
  if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0){
      perror("socket");
      exit(EXIT_FAILURE);
  }

  /*设置通信结构体*/
  bzero(&addr, sizeof(addr) );// 初始化为0
	addr.sin_family = AF_INET;// 
  addr.sin_port = htons( atoi(argv[2]) );// 端口号
  if(inet_aton(argv[1], &addr.sin_addr) == 0) {// IP 地址
      fprintf(stderr, "Invalid address\n");
      exit(EXIT_FAILURE);
  }

  /*绑定通信结构体*/
  if(bind(fd, (struct sockaddr *)&addr, sizeof(addr) ) == -1){
      perror("bind");
      exit(EXIT_FAILURE);
  }

  /*接收数据*/
  while(1){
      bzero(buf, BUFSIZ);// 缓冲区清零
      recvfrom(fd, buf, BUFSIZ, 0, NULL, NULL);
      printf("buf=%s\n", buf);
  }
  close(fd);
  return 0;
}

在这里插入图片描述

使用nc命令检验服务端程序

示例-客户端

udp_client.c

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

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

  /*主函数传参*/
  if(argc < 3){
      fprintf(stderr, "%s<addr><port>\n", argv[0]);
      exit(EXIT_FAILURE);
  }

  /*创建套接字*/
  if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0){
      perror("socket");
      exit(EXIT_FAILURE);
  }

  /*设置通信结构体*/
  bzero(&addr, sizeof(addr) );
	addr.sin_family = AF_INET;
  addr.sin_port = htons( atoi(argv[2]) );
  if(inet_aton(argv[1], &addr.sin_addr) == 0) {
      fprintf(stderr, "Invalid address\n");
      exit(EXIT_FAILURE);
  }

  /*发送*/
  while(1){
      bzero(buf, BUFSIZ);
      printf("Input->");
      fgets(buf, BUFSIZ, stdin);
      sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&addr, addrlen);
  }
  close(fd);
  return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeModBusRtu移植 --stm32L431RCT6(小熊派)

文章目录 前言一、移植前需要的工作二、修改点讲解1.串口中断2.定时器3.保持寄存器4.测试 总结 前言 最近需要做一个modbus485的传感器&#xff0c;主要是用来做从机。之前做过主机的是stm标准库&#xff0c;那这次做一个HAL的从机协议栈&#xff0c;方便大家直接获取数据。 移…

Linux驱动开发笔记(四)设备树进阶及GPIO、Pinctrl子系统

文章目录 前言一、设备树的进阶知识1. 追加/修改节点内容2.chosen子节点3. 获取设备树节点信息3.1 of_find_node_by_path( )函数3.2 of_find_node_by_name( )函数3.3 of_find_node_by_type( )函数3.4 of_find_compatible_node( )函数3.5 of_find_matching_node_and_match( )函数…

前端_调试工具_Chrome Devtools

目录 一、上左侧菜单功能 1.选择功能 2.手机/电脑 显示切换功能 3.内存 4.元素 5.控制台 6.源代码/来源 7.网络 8.应用 9.性能 10.安全 11.Lighthouse 12.记录器 13.性能数据分析 二、上右侧菜单功能 1.警告 2.设置 3....更多功能 谷歌浏览器自带了调试工具C…

TPC-H建表语句(MySQL语法)

TPC-H测试集介绍 TPC-H&#xff08;Transaction Processing Performance Council, Standard Specification, Decision Support Benchmark, 简称TPC-H&#xff09;是一个非常权威数据库基准测试程序&#xff0c;由TPC组织制定。 TPC-H定义了一个包含8个表的模式&#xff08;Sc…

亮数据代理IP助力高效数据采集

文章目录 &#x1f4d1;前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤&#xff1a; 五、数据集5.1 免费样本5.2 定制数据集 &#x1f324;️个人小结 &#x1f…

力扣 503. 下一个更大元素 II

题目来源&#xff1a;https://leetcode.cn/problems/next-greater-element-ii/description/ C题解&#xff1a;因为是循环数组&#xff0c;所以对数组进行了两次遍历&#xff0c;相当于循环。使用了栈&#xff0c;一个存放元素&#xff0c;一个存放索引&#xff0c;用来更新res…

龙迅LT8712X TYPE-C或者DP转HDMI加VGA输出,内置MCU,只是IIS以及4K60HZ分辨率

龙迅LT8712X描述&#xff1a; LT8712X是一种高性能的Type-C/DP1.2到HDMI2.0和VGA转换器&#xff0c;设计用于将USB Type-C源或DP1.2源连接到HDMI2.0和VGA接收器。LT8712X集成了一个DP1.2兼容的接收器&#xff0c;一个HDMI2.0兼容的发射机和一个高速三角机窝视频DAC。此外&…

AppInventor2有没有删除后的撤销功能?

问&#xff1a;不小心删除了组件&#xff0c;能撤回吗&#xff1f; 答&#xff1a;界面&#xff08;组件&#xff09;设计界面&#xff0c;没有撤销功能。代码&#xff08;逻辑&#xff09;设计视图&#xff0c;可以使用 CtrlZ 撤销&#xff0c;CtrlY 反撤销。 界面设计没有撤…

关于2024中国海洋装备博览会(福州)的参展通知

2024中国航洋装备博览会 2024世界航海装备大会 2024中国船舶供应链大会 2024中国航洋装备博览会2024世界航海装备大会 时间地点、规模、主题、定位 1.时间&#xff1a;2024年11月15日至18日 2.地点&#xff1a;福州海峡国际会展中心、冠城大通游艇码头 3.规模&#xff1…

【ROS2大白话】三、给turtlebot3安装realsense深度相机

系列文章目录 【ROS2大白话】一、ROS2 humble及cartorgrapher安装 【ROS2大白话】二、turtlebot3安装 【ROS2大白话】三、给turtlebot3安装realsense深度相机 【ROS2大白话】四、ROS2非常简单的传参方式 文章目录 系列文章目录效果展示一、修改model.sdf文件1. 路径位置2. 修改…

Day25 首页待办事项及备忘录添加功能

​ 本章节,完成首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 在 AddMemoViewModel逻辑处理类中,为了支持与其关联的View视图文件的数据绑定,需要定义一个与视图文件相匹配的实体类 Model。这个Model将包含 View中…

冯喜运:6.6外汇黄金原油晚间行情预测及独家操作建议

【黄金消息面分析】&#xff1a;周三&#xff08;6月5日&#xff09;&#xff0c;黄金价格继续区间波动并上涨&#xff0c;与周二的价格走势形成鲜明对比&#xff0c;此前美国公布的经济数据好坏参半&#xff0c;可能促使美联储降低借贷成本。美国国债收益率下降&#xff0c;美…

支付宝小众玩法 爱溜达的人不容错过

创建一个简单的程序来帮助用户管理他们的图片&#xff0c;例如筛选分辨率合适、尺寸适中的图片来准备上传&#xff0c;这是一个技术上合理且有益的方向。例如&#xff0c;一个Python脚本使用Pillow库来检查文件夹中图片的尺寸&#xff1a; from PIL import Image import os# 根…

深圳比创达EMC|EMC电磁兼容性行业:技术前沿与市场挑战

在当今高度信息化的社会&#xff0c;电磁兼容性&#xff08;EMC&#xff09;技术已成为各行各业不可或缺的一部分。随着电子设备的日益增多和复杂化&#xff0c;电磁环境日益复杂&#xff0c;电磁兼容性行业面临着前所未有的挑战和机遇。 一、EMC电磁兼容性行业的技术基础 电…

Qt图像处理技术十一:得到QImage图像的马赛克图像

效果图 指数5 指数15 指数40 原理 马赛克的原理很简单&#xff0c;就是取一个值&#xff0c;让这个值作为一个方格子的长宽&#xff0c;如40*40px的格子&#xff0c;取这个区域的平均R G B值&#xff0c;然后这个区域的所有像素点都是这个RGB值即可 源码 QImage applyM…

新能源管理系统主要包括哪些方面的功能?

随着全球对可持续发展和环境保护的日益重视&#xff0c;新能源管理系统已成为现代能源领域的核心组成部分。这一系统不仅涉及对新能源的收集、存储和管理&#xff0c;还包括对整个能源网络进行高效、智能的监控和控制。以下是新能源管理系统主要包含的几方面功能&#xff1a; 一…

STM32 HAL库USART的接收数据方法实现

目录 概述 1 使用STM32Cube生成项目 1.1 软件版本信息 1.2 配置串口相关参数 1.3 生成工程 2 问题描述 3 解决问题 3.1 修改代码 3.2 编写新的回调函数 4 测试 概述 本文主要介绍STM32 HAL库USART的接收数据方法实现&#xff0c;笔者使用的HAL库为STM32Cube_FW_F1_V1.…

鸿蒙开发 之 Stage模型

1.介绍 2.工程目录以及配置文件说明 配置文件 3.UIAbility创建流程 注意&#xff1a;退出应用先销毁的是windowStage之后是ability 4.页面及生命周期 5.UIAbility启动模式

【Mybatis】INSERT INTO 遇到NULL怎么处理?

目录标题 背景-使用Mybatis手写批量插入Insert方法测试核心代码&#xff0c;author字段为null&#xff0c;插入条件怎么写&#xff1f; MybatisPlus解决方案自动填充字段 Mybatis解决方案if标签处理 问题&#xff1a;如果不在工程里面设置默认值&#xff1f;如何直接使用数据库…

Qt窗口与对话框

目录 Qt窗口 1.菜单栏 2.工具栏 3.状态栏 4.滑动窗口 QT对话框 1.基础对话框QDiaog 创建新的ui文件 模态对话框与非模态对话框 2.消息对话框 QMessageBox 3.QColorDialog 4.QFileDialog文件对话框 5.QFontDialog 6.QInputDialog Qt窗口 前言&#xff1a;之前以上…