接收端编程、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,一经查实,立即删除!

相关文章

【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…

探索直播美颜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;连接后合作商就会获得一定的收益。这种模式既方便了用户…

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

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

PaddlePaddle框架安装

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

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;我们先让…

Spring Boot 本地部署 JSP

自己是Spring Boot 的初学者&#xff0c;开始看教程的时候发现基本上都是部署的 JSP&#xff0c;但是按照教程一步步走下来始终无法成功&#xff0c;一直都是 404: 查阅各种资料后&#xff0c;总结出一套 Spring Boot 支持 JSP 的流程&#xff1a; 添加依赖 在pom.xml中添加…

Java算法之动态规划

Java算法之动态规划 前言 ​ 最近这一段时间一直在刷算法题&#xff0c;基本上一有时间就会做一两道&#xff0c;这两天做了几道动态规划的问题&#xff0c;动态规划之前一直是我比较头疼的一个问题&#xff0c;感觉好复杂&#xff0c;一遇到这样的问题就想跳过&#xff0c;昨…

NIN网络中的网络

是什么 intro LeNet→AlexNet→VGG→NiN→GoogLeNet→ResNetLeNet→AlexNet→VGG 卷积层模块充分抽取空间特征全连接层输出分类结果AlexNet & VGG 改进在于把两个模块加宽 、加深&#xff08;加宽指增加通道数&#xff0c;那加深呢&#xff1f;&#xff08;层数增加叭 Ni…

qemu快速入门

前提&#xff1a; 我们做嵌入式软件的时候&#xff0c;往往可能会缺少嵌入式的硬件&#xff0c;那我们希望提前开始准备代码的话&#xff0c;就需要qemu这个开源软件&#xff0c;它可以模拟各种型号的芯片 。那么我们可以提前在这个模拟器上面去开发代码、验证、调试。 正片开始…

跨境电商新篇章:独立站如何携手海外网红营销,实现品牌飞跃

随着品牌出海的火热&#xff0c;独立站成为越来越多企业的选择。然而&#xff0c;在激烈的市场竞争中&#xff0c;如何提高独立站的知名度&#xff0c;成为企业亟需解决的问题之一。在这个背景下&#xff0c;海外网红营销崭露头角&#xff0c;成为一种备受关注的新型推广策略。…

Covalent(CQT)降低数据可用性成本,加快 Layer2 在 Web3 领域的扩张

Covalent Network&#xff08;CQT&#xff09;通过其统一 API&#xff0c;正在为 EVM Layer2 生态系统提供支持&#xff0c;减少了开发者需要导航多个数据供应商的需求&#xff0c;通过解决多链环境中的碎片化挑战&#xff0c;极大地提高了他们的效率。 通过其统一 API 支持 2…

蓝桥杯嵌入式2018年第九届省赛主观题解析

1 题目 2 解析 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body********************************************************************…