接收端编程、UDP编程练习、wireshrak抓包工具、UDP包头

我要成为嵌入式高手之3月6日Linux高编第十六天!!
————————————————————————————

学习笔记

接收端

recvfrom

#include <sys/types.h>
#include <sys/socket.h>

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

功能:从套接字中接收数据

参数:

        sockfd:套接字文件描述符

        buf:存放数据空间首地址

        flags:属性,默认为0;

        src_addr:存放IP地址信息空间的首地址

        addrlen:存放接收到ip地址大小空间的首地址、

返回值:成功返回实际接收字节数,失败返回-1;

inet_ntoa

功能:将二进制转换为字符串

ntohs

功能:将大端字节序转换为本地字节序

#include "head.h"int main(void)
{int sockfd = 0;struct sockaddr_in recvaddr;struct sockaddr_in tmpaddr;char tmpbuff[1024] = {0};ssize_t nsize = 0;ssize_t nsize1 = 0;char recvbuff[1024] = {0};socklen_t recvbufflen;recvbufflen = sizeof(tmpaddr);fgets(tmpbuff, sizeof(tmpbuff), stdin);// while (1){/*创建用来通信的UDP套接字*/sockfd = socket(AF_INET, SOCK_DGRAM, 0);//通信使用的协议族(AF_INET是IPv4协议族),套接字类型:数据报套接字;默认0if (-1 == sockfd){perror("fail to socket");return -1;}/*对接收方地址赋值*/recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50001);//本地字节序转换为网络的大端字节序recvaddr.sin_addr.s_addr = inet_addr("192.168.1.101");//函数接口inet_addr将字符串的ip地址转换为内存当中的IP地址//前面是ip地址转换为32位之后的变量名/*发送信息*/nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));//0为发送的属性,默认为0,发送到哪里(那个空间的首地址),那个地方的空间大小if (-1 == nsize){perror("fail to sendto");return -1;}//printf("成功发送%ld字节!\n", nsize);/*接收信息*/nsize1 = recvfrom(sockfd, recvbuff, sizeof(recvbuff), 0, (struct sockaddr *)&tmpaddr, &recvbufflen);if (-1 == nsize1){perror("fail to recvform");return -1;}printf("RECV ASCII FROM %s:%d  %s\n", inet_ntoa(tmpaddr.sin_addr), ntohs(tmpaddr.sin_port), recvbuff);}close(sockfd);return 0;
}

bind

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:在套接字绑定一个IP地址和端口号

参数:

        sockfd:套接字的文件描述符

        addr:绑定的IP地址空间的首地址

        addrlen:绑定IP地址的长度

返回值:成功0,失败-1;

UDP编程

发端:

        socket -> sendto -> close

收端:

        socket -> bind -> recvfrom -> close

发端:

#include "head.h"int main(void)
{int sockfd = 0;char tmpbuff[1024] = {0};struct sockaddr_in myaddr;struct sockaddr_in recvaddr;ssize_t nsize = 0;int ret = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}myaddr.sin_family = AF_INET;myaddr.sin_port = htons(54321);myaddr.sin_addr.s_addr = inet_addr("192.168.1.172");ret = bind(sockfd, (struct sockaddr *)&myaddr, sizeof(myaddr));if (ret == -1){perror("fail to bind");return -1;}fgets(tmpbuff, sizeof(tmpbuff), stdin);recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(30000);recvaddr.sin_addr.s_addr = inet_addr("192.168.1.167");nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == nsize){perror("fail to sendto");return -1;}printf("成功发送%ld字节数据\n", strlen(tmpbuff));close(sockfd);return 0;
}

收端:

#include "head.h"int main(void)
{int sockfd = 0;struct sockaddr_in myaddr;int ret = 0;size_t nsize = 0;char tmpbuff[1024] = {0};struct sockaddr_in sendaddr;socklen_t sendaddrlen;sendaddrlen = sizeof(sendaddr);   sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to sockfd");return -1;}myaddr.sin_family = AF_INET;myaddr.sin_port = htons(33333);myaddr.sin_addr.s_addr = inet_addr("192.168.1.172");ret = bind(sockfd, (struct sockaddr *)&myaddr, sizeof(myaddr));if (-1 == ret){perror("fail to bind");return -1;}nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, (struct sockaddr *)&sendaddr, &sendaddrlen);if (-1 == nsize){perror("fail to recvfrom");return -1;}printf("RECV ASCII FROM %s:%d  %s", inet_ntoa(sendaddr.sin_addr), ntohs(sendaddr.sin_port), tmpbuff);return 0;
}

练习:

编写程序实现两台主机间传输一个文件

UPD中需要注意的点

1、UDP是无连接的,发端退出收端没有任何影响

2、UDP发送数据上限,最好不要超过1500字节

3、UDP是不安全不可靠的,连续且快速的传输数据容易产生数据丢失

wireshark

抓包工具

操作流程

        1、打开wireshrak

        2、选择抓取数据报的网卡(any)

        3、执行通信的代码

        4、停止通信

        5、设定过滤条件

                ip.addr == IP地址

                UDP\TCP\

                udp.port == 端口号

UDP包头

长度:8字节

源端口号(2字节)

目标端口号(2字节)

包长度(2字节)

校验和(2字节)

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

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

相关文章

JVM(Java虚拟机)概述

1. JVM的定义和作用 JVM&#xff08;Java Virtual Machine&#xff09;是一个能够运行Java字节码的虚拟计算机。它是Java平台的核心组成部分&#xff0c;负责执行编译后的Java程序&#xff0c;提供跨平台运行的能力。JVM使得Java程序可以在任何安装了JVM的操作系统上运行&#…

【50天50个项目】旋转导航页面

实现效果&#xff1a; HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><link rel"stylesheet&…

asp飞机订票-57-(说明+代码)

演示查看 http://pc.3q2008.Com/3q2008_Com/hkdp 目 录 1&#xff0e; 系统规划 3 1&#xff0e;1 行业背景 3 1&#xff0e;2 行业现状 3 1.2.1用户注册 3 1.2.2航班查询 3 1.2.3在线订票 3 1.2.4在线支付 3 1.2.5电子客票 4 1.2.6其它辅助产品与服务 4 1&#xff0e;3 需求…

[Mac软件]Adobe Illustrator 2024 28.3 intel/M1/M2/M3矢量图制作软件

应用介绍 Adobe Illustrator 是行业标准的矢量图形应用程序&#xff0c;可以为印刷、网络、视频和移动设备创建logos、图标、绘图、排版和插图。数以百万计的设计师和艺术家使用Illustrator CC创作&#xff0c;从网页图标和产品包装到书籍插图和广告牌。 绘制任意大小的标志 拥…

Timus#1005

C【动态规划】 #include<iostream> #include<vector> using namespace std; int main() {int n;cin >> n;vector<int> dp(100000 * 20);vector<int> a(n);int ans 0, cur 0;for (int i 0; i < n; i){cin >> a[i];ans a[i];}int sum…

C++ 求不同数组的最大值

编写一个名为max()的函数&#xff0c;用于求包含n个元素的数组的最大值&#xff0c;要求通过函数重载能求int、double、char、string的最大值。 函数接口定义&#xff1a; int max(int *a, int n) ; double max(double *a, int n) ; char max(char *a, int n); string max(str…

探索直播美颜SDK背后的深度学习算法:智能化美肤与特效实现

美颜SDK背后的技术原理和深度学习算法近期很多读者向小编提问。今天&#xff0c;我将为大家深入讲解直播美颜SDK背后的深度学习算法&#xff0c;以及智能化美肤与特效实现的原理与应用。 一、美颜SDK的背后&#xff1a;深度学习算法 美颜SDK是一种集成了多种美颜功能的软件开…

【APB协议 UVM_Sequencer Driver Monitor_2024.03.04】

apb协议 写时序 地址、写信号、PSEL、写数据信号同时发生变化&#xff0c;即传输的第一个时钟被称为SETUP周期。在下个时钟上升沿,PENABLE信号拉高&#xff0c;表示ENABLE周期&#xff0c;在该周期内&#xff0c;数据、地址以及控制信号都必须保持有效。整个写传输在这个周期…

分享几个Google Chrome谷歌浏览器历史版本下载网站

使用selenium模块的时候&#xff0c;从官网下载的谷歌浏览器版本太高&#xff0c;驱动不支持&#xff0c;所以需要使用历史的谷歌浏览器版本 &#xff0c;这里备份一下以防找不到了。 驱动下载地址&#xff1a;https://registry.npmmirror.com/binary.html?pathchromedriver 文…

WiFi贴码推广能赚钱吗?掌握WiFi贴码推广技巧

“WiFi贴码推广能赚钱吗”是当前很多创业者关注的一个话题&#xff0c;WiFi贴码推广这一新兴的商业模式&#xff0c;是指商家在其门店或者特定场所提供免费WiFi&#xff0c;不需要输入密码wifi二维码即可连接&#xff0c;连接后合作商就会获得一定的收益。这种模式既方便了用户…

【Node.js从基础到高级运用】七、基本的网络编程

基本的网络编程 在这一节中&#xff0c;我们将介绍 Node.js 在网络编程方面的基础&#xff0c;特别是如何使用 Node.js 创建一个 HTTP 服务器。这是构建 Web 应用和服务的核心技能。 创建 HTTP 服务器 Node.js 的 http 模块提供了创建 HTTP 服务器和客户端的能力。以下是创建…

白酒:陈酿过程中的理化变化与香味成分的转化

在豪迈白酒的陈酿过程中&#xff0c;理化变化和香味成分的转化是形成与众不同风味和品质的重要环节。云仓酒庄深入了解和掌握陈酿过程中的理化变化规律&#xff0c;以及香味成分的转化机制&#xff0c;通过科学的方法和精细的管理&#xff0c;提升豪迈白酒的品质和口感。 首先&…

CMake:编写 CMakeLists 文件

文章目录 编辑 CMakeLists 文件CMake 语言注释变量变量范围命令基本命令流控制条件语句循环构造过程定义正则表达式高级命令 本章将介绍编写有效 CMakeList 的基础知识 文件。它将涵盖基本命令和问题 您将需要处理大多数项目。虽然 CMake 可以处理极其复杂的问题 项目&#xff…

Rust 语言的 println! 宏的格式占位符

一、占位符 println! 宏的占位符主要基于 Rust 的格式化语法&#xff0c;它支持多种占位符格式来插入和格式化不同的值。除了 {} 和 {:?} 之外&#xff0c;还有其他几种形式&#xff1a; 基本占位符 {}&#xff1a;用于插入任何实现了 Display trait 的类型的值。 调试占位符…

PaddlePaddle框架安装

提示&#xff1a;可在python环境中进行安装&#xff0c;避免环境污染&#xff0c;创建命令conda create -n xxx_name python3.9,激活conda activate xxx_name 第一步&#xff1a;查看计算机平台版本 在窗口输入查看命令&#xff0c;查看CUDA的版本 nvidia-smi 二、根据以下条件…

webpack和vite的区别

webpack和vite都是现代化web构建工具,但他们在构建速度、开发体验、构建结果等方面有所不同 1、构建速度:vite的速度一般快于webpack (1)传统的构建工具例如webpack在开发过程中会对整个应用或者大部分应用进行打包,之后浏览器才能加载处理之后的包(好比webpack打包先从入口文…

C语言---单身狗问题

1.单身狗初阶 这个题目就是数组里面有一串数字&#xff0c;都是成对存在的&#xff0c;只有一个数字只出现了一次&#xff0c;请你找出来 &#xff08;1&#xff09;异或是满足交换律的&#xff0c;两个相同的数字异或之后是0&#xff1b; &#xff08;2&#xff09;让0和每个…

如何利用数据采集工具,解决医疗数据采集痛点?

在当今信息发达的时代&#xff0c;医疗行业也面临着日益增长的数据量和越来越复杂的管理和挑战。医院是医疗服务的核心机构&#xff0c;需要处理大量病人信息、医疗记录、医疗影像等&#xff0c;从而确保病人最佳的治疗。 但传统的医院数据信息往往存在诸多问题&#xff0c;如…

CVPR 2022 Oral | Bailando: 基于编舞记忆和Actor-Critic GPT的3D舞蹈生成

目录 测试结果&#xff1a; 02 提出的方法 测试结果&#xff1a; 预测有3个步骤&#xff0c;速度比较慢 02 提出的方法 1. 针对舞蹈序列的VQ-VAE和编舞记忆 与之前的方法不同&#xff0c;我们不学习从音频特征到 3D 关键点序列的连续域的直接映射。相反&#xff0c;我们先让…

Oracle Linux 8.9 安装 Python 3.11.8 和 Miniconda

Oracle Linux 8.9 安装 Python 3.11.8 和 Miniconda 1. 安装 Python 3.11.82. 安装 Miniconda 1. 安装 Python 3.11.8 Update system, sudo dnf update -yInstall Library, sudo dnf install curl gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make git -yI…