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

news2025/6/17 6:31:52

我要成为嵌入式高手之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协议族),套接字类型:数据报套接字;默认0
        if (-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.coloradmin.cn/o/1503860.html

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

相关文章

AI绘画提示词案例(宠物

目录 1. 雪地猫猫&#xff1a;1.1 提示词&#xff1a;1.2 效果&#xff1a; 2. 趴地猫猫&#xff1a;2.1 提示词&#xff1a;2.2 效果&#xff1a; 3. 长城萨摩耶&#xff1a;3.1 提示词&#xff1a;3.2 效果&#xff1a; 4. 沙发猫猫&#xff1a;4.1 提示词&#xff1a;4.2 效…

2024年新手视频剪辑软件推荐-6款视频剪辑软件测评

视频剪辑软件推荐 premiere premiere 直达地址:各大软件网站 说到底,还是得专业的来,虽然很多人觉得他是收费的,但是你懂的,想要免费总是会有办法的.别的不说,剪辑这块,我还是很认可这个软件,虽然我现在还是刚入门. 剪映 剪映 抖音官方推出的一款手机视频编辑剪辑应用,提供切割…

opencv编程

opencv编程 引言&#xff1a; ​ 本实验旨在介绍使用OpenCV进行图像处理和视频处理的基本操作。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉库&#xff0c;提供了丰富的图像和视频处理功能&#xff0c;既可以进行图像的读取、显示…

猫头虎分享已解决Bug || 批处理错误:BatchJobFailure, ProcessingDelay

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

手机号验证码重新发送

前文叙述 很久以前做的一个 demo &#xff0c;纯 HTML 、CSS、js 制作&#xff0c;一定时间段之后才可以重新发送验证码&#xff0c;如 60s 后再次发送验证码&#xff0c;在该时间段内发送验证码按钮为禁用状态&#xff0c;实战开发过程也亦是同理&#xff0c;因此记录一手。 一…

【IEEE列表会议】IEEE第三届信息与通信工程国际会议国际会议(JCICE 2024)

会议简介 Brief Introduction 2024年第三届信息与通信工程国际会议国际会议 (JCICE 2024) 会议时间&#xff1a;2024年5月10日-12日 召开地点&#xff1a;中国福州 大会官网&#xff1a;JCICE 2024-2024 International Joint Conference on Information and Communication Engi…

王道机试C++第 4 章 字符串:字符串内容续写几个小程序 Day30

统计字符 习题描述 统计一个给定字符串中指定的字符出现的次数。 输入描述&#xff1a; 测试输入包含若干测试用例&#xff0c;每个测试用例包含2行&#xff0c;第1行为一个长度不超过5的字符串&#xff0c;第2行为一个长度不超过80的字符串。注意这里的字符串包含空格&…

Unity性能优化篇(十) 模型优化之网格合并 Easy Mesh Combine Tool插件使用以及代码实现网格合并

把多个模型的网格合并为一个网格。可以使用自己写代码&#xff0c;使用Unity自带的CombineMeshes方法&#xff0c;也可以使用资源商店的插件&#xff0c;在资源商店搜Mesh Combine可以搜索到相关的插件&#xff0c;例如Easy Mesh Combine Tool等插件。 可大幅度减少Batches数量…

零、自然语言处理开篇

目录 0、NLP任务的基础——符号向量化 0.0 词袋模型 0.1 查表/One-hot编码 0.2 词嵌入模型/预训练模型 0.2.0 Word2Vec &#xff08;0&#xff09;CBOW &#xff08;1&#xff09;Skip-gram 0.2.1 GloVe 0.2.2 WordPiece 0.2.3 BERT 0.2.4 ERNIE NLP自然语言处理&am…

微信小程序-入门

1.下载和安装Npm&#xff1a;Npm https://docs.npmjs.com/downloading-and-installing-node-js-and-npm 或者 https://nodejs.org/en/download/ 未安装npm 提示 以下以安装node安装包为例 按任意键继续 安装完成后 2. 下载和安装小程序开发工具 &#xff1a;https:/…

@EnableWebMvc介绍和使用详细demo

EnableWebMvc是什么 EnableWebMvc 是 Spring MVC 中的一个注解&#xff0c;它用于启用 Spring MVC 框架的基本功能&#xff0c;以便你可以使用 Spring MVC 提供的特性来处理 Web 请求。 通常情况下&#xff0c;在基于 Spring Boot 的应用中&#xff0c;并不需要显式地使用 Ena…

音视频开发_音频基础知识

如何采集声音——模数转换原理 声音模数转换是将声音信号从模拟形式转换为数字形式的过程。它是数字声音处理的基础&#xff0c;常用于语音识别、音频编码等应用中。 音视频通信流程 音视频采集&#xff1a;首先是从麦克风、摄像头等设备中采集音频和视频数据&#xff0c;将现…

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频!

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频&#xff01; Corel Video Studio 2024免费下载Keygen 你厌倦了在视频编辑软件上花大钱吗&#xff1f;别再看了&#xff01;我们为您提供了完美的解决方案——Corel Video Studio 2024。最棒的部分是什么&#xff1f;…

目标检测——监控下打架检测数据集

一、简述 首先&#xff0c;监控下打架检测是维护公共安全的重要手段。在公共场所、学校、监狱等地方&#xff0c;打架事件往往难以避免。通过安装打架检测监控系统&#xff0c;可以实时监控并准确识别打架事件&#xff0c;及时采取必要的应对措施&#xff0c;有效地减少打架事…

猫头虎分享已解决Bug || 数据中心断电:PowerLoss, DataCenterBlackout

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

存算一体成为突破算力瓶颈的关键技术?

大模型的训练和推理需要高性能的算力支持。以ChatGPT为例&#xff0c;据估算&#xff0c;在训练方面&#xff0c;1746亿参数的GPT-3模型大约需要375-625台8卡DGX A100服务器训练10天左右&#xff0c;对应A100 GPU数量约3000-5000张。 在推理方面&#xff0c;如果以A100 GPU单卡…

qsort函数的用法及参数的讲解

第一种用法展示&#xff1a;&#xff08;整形数组的qsort&#xff09; 一&#xff0c;qsort函数的定义&#xff1a; qsort 函数的定义&#xff1a;void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*)); 使用其需要包含头文件&#x…

浅述字典攻击

一、前言 字典攻击是一种常见的密码破解方法&#xff0c;它使用预先编制的字典文件作为攻击字典&#xff0c;通过尝试猜测密码的方式来破解密码。下面是一个关于字典攻击的博客&#xff0c;希望能够为您了解字典攻击提供帮助。 二、字典攻击概述 字典攻击是一种密码破解方法&…

STL容器之哈希的补充——其他哈希问题

1.其他哈希问题 ​ 减少了空间的消耗&#xff1b; 1.1位图 ​ 位图判断在不在的时间复杂度是O(1)&#xff0c;速度特别快; ​ 使用哈希函数直接定址法&#xff0c;1对1映射&#xff1b; ​ 对于海量的数据判断在不在的问题&#xff0c;使用之前的一些结构已经无法满足&…

Vue快速开发一个主页

前言 这里讲述我们如何快速利用Vue脚手架快速搭建一个主页。 页面布局 el-container / el-header / el-aside / el-main&#xff1a;https://element.eleme.cn/#/zh-CN/component/container <el-container><el-header style"background-color: #4c535a"…