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

news2024/11/23 0:35:05

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;
}

在这里插入图片描述

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

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

相关文章

【Linux】进程(7):地址空间

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;7&#xff09;&#xff1a;地址空间&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 &#xff08;A&#xff09; 直接看代码&…

Leetcode3169. 无需开会的工作日

Every day a Leetcode 题目来源&#xff1a;3169. 无需开会的工作日 解法1&#xff1a;排序 遍历 按 LeetCode56.合并区间 的做法&#xff0c;把 meetings 数组中所有重叠的区间合并起来&#xff0c;再统计其中无需开会的工作日个数。 代码&#xff1a; /** lc appleetco…

学习笔记——路由网络基础——缺省(默认)路由

3、缺省(默认)路由 1、定义 缺省路由(默认路由)&#xff1a;是目的地址和掩码都为全0的特殊路由。全0代表任意网络。缺省路由在路由表中的形式为&#xff1a;0.0.0.0/0缺省路由也被叫默认路由。缺省路由优先级比直连路由低 缺省路由是一种特殊的路由&#xff0c;当报文没有在…

cv2.imwrite路径中存在中文时出现乱码问题

cv2.imwrite(path, img) 在写入包含中文的路径的时候&#xff0c;保存的文件名称为乱码。 解决办法&#xff1a; cv2.imwrite(path,image)将上面的代码修改为以下代码&#xff0c;可以避免出现中文乱码。 cv2.imencode(.jpg, image)[1].tofile(path)

嵌入式Linux系统编程 — 2.2 标准I/O库:检查或复位状态

目录 1 检查或复位状态简介 2 feof()函数 2.1 feof()函数简介 2.2 示例程序 3 ferror()函数 4 clearerr()函数 4.1 clearerr()函数简介 4.2 示例程序 1 检查或复位状态简介 调用 fread() 函数读取数据时&#xff0c;如果返回值小于参数 nmemb 所指定的值&#xff0c;这…

python常见数据分析函数

apply DataFrame.apply(func, axis0, broadcastFalse, rawFalse, reduceNone, args(), **kwds) 第一个参数是函数 可以在Series或DataFrame上执行一个函数 支持对行、列或单个值进行处理 import numpy as np import pandas as pdf lambda x: x.max()-x.min()df pd.DataFrame(…

【数据结构】详解堆的基本结构及其实现

文章目录 前言1.堆的相关概念1.1堆的概念1.2堆的分类1.2.1小根堆1.2.2大根堆 1.3堆的特点堆的实用场景 2.堆的实现2.1初始化2.2插入2.3堆的向上调整2.4删除2.5堆的向下调整2.6判空2.7获取堆顶元素2.8销毁 3.堆排序3.1实现3.2堆排序的时间复杂度问题 前言 在上一篇文章中&#…

【数据库】SQL零基础入门学习

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

如何通过 4 种方式备份和恢复Android联系人

毫无疑问&#xff0c;联系人是Android手机上存储的最重要的信息之一。为了保护这些重要数据&#xff0c;明智的做法是对Android手机进行联系人备份。如果您的手机发生任何情况导致数据丢失&#xff0c;例如被盗、系统崩溃或物理损坏&#xff0c;您可以再次将备份中的联系人恢复…

Typecho:简约而强大的开源PHP博客平台

Typecho&#xff1a;让博客写作回归本质- 精选真开源&#xff0c;释放新价值。 概览 Typecho是一个开源的PHP博客平台&#xff0c;以其简洁的界面和强大的功能&#xff0c;为博客作者提供了一个高效、易于管理的写作环境。它是一个轻量级、高性能的解决方案&#xff0c;适用于…

主流数据库的大数据插入对比(mssql[sql server]、oracle、postgresql、mysql、sqlite)

首先申明&#xff0c;做这个对比不代表数据库性能&#xff0c;纯属好奇。勿喷&#xff0c;感谢。 测试连续11次插入数据库&#xff0c;每次100万行数据。 测试环境&#xff1a;单机测试&#xff0c;就是所有数据库都装在本机上。操作系统:windows server 2016&#xff0c;使用…

【YOLOV8】1.开发环境搭建

Yolo8出来一段时间了,包含了目标检测、实例分割、人体姿态预测、旋转目标检测、图像分类等功能,所以想花点时间总结记录一下这几个功能的使用方法和自定义数据集需要注意的一些问题,本篇是第一篇,开发环境的配置。 YOLO(You Only Look Once)是一种流行的物体检测和图像分割…

工控主板分类详解

1.ATX系列 尺寸305*244mm;接口扩展丰富,更多的内存和PCIE插槽; 进一步略小的有MATX,尺寸244*244cm;扩展插槽缩减,但兼容ATX接口,依旧是按照ATX标准 2.ITX系列 尺寸170*170mm;相较于ATX主板更加迷你,功能接口也少一些; 常用于小型计算机或者嵌入式系统 高能计算机推…

【Pycharm】功能介绍

1.Code Reformat Code 格式化代码&#xff0c;可以帮助我们去自动调整空格等&#xff0c;根据python语法规范自动调整 2.Settings 1.创建py文件默认填充模版 3.读写py文件编码格式一致性 顶部代码指定的编码方式作用&#xff1a; 可以保证python2/3解释器在读取文件的时候按…

将HTML页面中的table表格元素转换为矩形,计算出每个单元格的宽高以及左上角坐标点,输出为json数据

export function huoQuTableElement() {const tableData []; // 存储表格数据的数组let res [];// 获取到包含表格的foreignObject元素const foreignObject document.getElementById(mydctable);if (!foreignObject){return ;}// 获取到表格元素let oldTable foreignObject…

python tk实现标签切换页面

import tkinter as tk from tkinter import ttk# 初始化主窗口 root tk.Tk() root.title("标签页示例")# 设置窗口大小 root.geometry("400x300")# 创建 Notebook 小部件 notebook ttk.Notebook(root) notebook.pack(expandTrue, fill"both")#…

【leetcode面试经典150题】-45. 跳跃游戏 II

【leetcode面试经典150题】-45. 跳跃游戏 II 1 题目介绍2 个人解题思路2.1 代码 3 官方题解3.1 代码 1 题目介绍 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] …

[职场] 研究生面试自我介绍_1 #经验分享#知识分享

研究生面试自我介绍 想要进入职场&#xff0c;面试是必不可少的。然而想要面试成功&#xff0c;就需要一个让人印象深刻的自我介绍&#xff0c;好的自我介绍可以让面试官&#xff0c;快速了解自己&#xff0c;快速记住自己。 一、范文1 我是一名硕士研究生&#xff0c;即将毕业…

如何查询公网IP?

在互联网中&#xff0c;每个设备都有一个唯一的公网IP地址&#xff0c;用于标识设备在全球范围内的位置。查询公网IP是一个常见的需求&#xff0c;无论是用于远程访问、网络配置还是其他目的&#xff0c;了解自己的公网IP地址都是很有必要的。本文将介绍几种常见的方法来查询公…

【ArcGISProSDK】 读取多面体信息并导出XML

结果展示 代码 using ArcGIS.Core.CIM; using ArcGIS.Core.Data; using ArcGIS.Core.Data.DDL; using ArcGIS.Core.Geometry; using ArcGIS.Core.Internal.CIM; using ArcGIS.Desktop.Catalog; using ArcGIS.Desktop.Core; using ArcGIS.Desktop.Editing; using ArcGIS.Deskto…