网络套接字发送结构体及数据处理

2023-10-30

struct很基础,但是说实话,我还不是很了解,以下是借鉴别人的,转载地址:http://blog.chinaunix.net/uid-21372424-id-119782.html

 一。  最近在做嵌入式系统**与windows的网络通信,由于**这边要发送的数据有char,float,int型,这些类型在内存中的存放格式不一样,所以我选择定义结构体进行处理!

如下:

struct data
{
  char AA[8];
  float BB[4];
  int CC[4];
  char DD[6];

}sendBuf;

可是这样定义就出现了一个问题,VC对变量存储会有一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。所以这个结构体用sizeof()以后会得出:48。详见:http://baike.baidu.com/view/1534200.htm所以当我用网络发送结构体:

send(socket,(struct data*)&sendBuf,sizeof(sendBuf),0)

发送后,接收端我用char buf[]接收。可是当我要进行小端数据转换时却得不到正确的数据,并且出现多余字节。本来这只需要48个字节就可以接收完,可是,却到了50,那么中间的一些字节是哪里来的呢?我现在还想不通!正是因为这样,产生了错位,我没法找到正确的float型数据在内存中的二进制存储起始地址,那就没法对它进行数据转换,那么相应也就不能进行数据处理了!

在网上找了很久,却没发现满意的答案!好多都是如何发送结构体的,其实发送结构体就是上面的那条语句。后来突然想起来上面的struct的字节长度,才有所悟,觉得是不是我应该对它进行一个自我补全呢?想想干脆把结构体定义成如下:

struct data
{
  char AA[8];
  float BB[4];
  int CC[4];
  char DD[8];

}sendBuf;

这样我先把char DD[]中多的两个字节置0,对数据处理也没多大影响,这下再发送,接收到的数据竟然居然真的正常了。我再进行数据转换,位置也就直接按照数据存储格式所占的空间稍微计算一下就得出起始位置了。关于这个问题,我也想不通为什么。

二。接下来就是windows端的数据处理了

   首先我接收到的数据存入一个文件里。由于数据很多,我不可能只定义一个buf就能把数据装下。所以就只有定义一个小buf,每次从文件里读取一些数据出来。这样就有一个问题,我们需要找到上一次读完数据的地址。于是我决定用fseek()函数http://baike.baidu.com/view/656696.htm

模拟测试代码如下:

/**********************************************************
* fptest.c
* introduce:假设我是每8个数据为1帧,并且每100个数据存放在FLASH
*           的一块地址里,由些算来100个数据里就只有完整的8*12=96
*           个数据,余下的四个数据为0,也就是无效数据。如果我们
*           每次只从文档里读取8个数据,这样的话最后帧就会断开,也
*           会给数据处理带来一些麻烦。所以我选择每次从文档里读出
*           100个数据。这样我可以直接对前面的96个处理,余下的不管
* date: 2009-05-05           name: dongfs
**************************************************************/
#include "stdio.h"
#include "string.h"

void main()
{
    FILE *fp;/*定义文件型指针变量*/

    int i,j,k;

    char writeBuf[900];/*模拟要存入文档的大量数据*/
    char readBuf[100];/*每次要读出来的数据*/

    /*初始化buf,它所需的头文件为string.h*/
    memset(readBuf,'\0',sizeof(readBuf));

    /*初始化writeBuf*/
    for (k = 0; k < 9; k++)
    {
        for (i = 0; i < 100; i++)
        {
            writeBuf[i+k*100] = i;
        }
    }
    
    
    /*打开文件,"wb+"为读写建立一个新的二进制文件*/
    if ((fp = fopen("data.txt","wb+")) == NULL)
    {
        perror("open error!\n");        
    }
    /*将数据块writeBuf写入文档*/
    if (fwrite(writeBuf,900,1,fp) == NULL)
    {
        perror("write error!\n");
    }
    else
        fclose(fp);


    /*打开文件:为读写打开一个二进制文件*/
    if ((fp = fopen("data.txt","rb+")) == NULL)
    {
     perror("open error!\n");
    }


    printf("\n");
    /*循环读取100次,将文档的数据依次读完*/
    for (i = 0; i < 100; i++)
    {
        /*由于要对文件进行顺序读写,那么就要找到控制文件的位置指针。

          用fseek函数可以实现改变文件的位置指针。但是fseek()函数

          一般用于二进制文件,因为文本文件要发生字符转换,计算位置时
         往往会发生混乱。所以在我读写前的参数都是使用的二进制参数。*/
        fseek(fp,i*100,0);
        fread(readBuf,100,1,fp);

        for (j = 0; j < 100; j++)
        {
                printf("readBuf[%d] = %d\n",j,readBuf[j]);
        }

        printf("\n");
        printf("\n");
    
    }

fclose(fp); 
} 

三.以上均为我学习时的一些总结,很基础,希望大家不要笑哈!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络套接字发送结构体及数据处理 的相关文章

  • LeetCode上仅有的四道shell编程题解析

    LeetCode 195 第十行 01题目描述 给定一个文本文件 file txt 请只打印这个文件中的第十行 02文件内容 Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 L
  • HTML 实现仿 Windows 桌面主题特效

    个人网站 海拥 摸鱼小游戏 开发文档导航 风趣幽默的人工智能学习网站 人工智能 想寻找共同学习交流的小伙伴 请点击 全栈技术交流群 免费且实用的计算机相关知识题库 进来逛逛 给大家安利一个免费且实用的前端刷题 面经大全 网站 点击跳转到网站
  • 数据挖掘案例实战:利用LDA主题模型提取京东评论数据(一)

    泰迪智能科技 数据挖掘平台 TipDM数据挖掘平台 最新推出的数据挖掘实战专栏 专栏将数据挖掘理论与项目案例实践相结合 可以让大家获得真实的数据挖掘学习与实践环境 更快 更好的学习数据挖掘知识与积累职业经验 专栏中每四篇文章为一个完整的数据
  • 如何让驱动开机自动启动

    如果你的驱动是nt式驱动的话 也就是说 在注册表 HKEY LOCAL MACHINE SYSTEM CurrentControlSet services 下面 有一个你驱动的服务的话 这个服务下面有个 Start 的键 它取值0 1 2都
  • openGL之API学习(九十八)glGetProgramInfoLog

    返回着色器程序的日志信息 void glGetProgramInfoLog GLuint program GLsizei maxLength GLsizei length GLchar infoLog program Specifies t
  • 阿里云日志服务基础

    阿里云日志服务 标签 空格分隔 阿里云 1 核心概念 地域 Region 地域为阿里云的服务节点 用户通过在不同的阿里云Region部署服务 让自己的服务距离客户更近 获得更低的访问延时及更好的用户体验 目前阿里云在全国各地拥有多个Regi
  • 虚拟机VirtualBox下载与安装、安装Ubuntu超详细图文步骤,对一些配置问题也有所写。

    对于机器学习和深度学习来说 Linux系统是必不可少的 而我们在只是学习当中一般不会去重装一个Linux系统 而是去使用虚拟机来使用Linux系统 在VMware与VirtualBox这两款虚拟机的体验上 个人更偏向于后者 因为它所占内存更
  • 【编写高质量代码:改善Java程序的151个建议】第10章:性能和效率,第11章:开源世界,第12章:思想为源___建议132~151

    第10章 性能和效率 建议132 提升Java性能的基本方法 Java性能优化的35个细节 珍藏版 建议133 若非必要 不要克隆对象 JVM对new进行了大量的性能优化 而clone方式只是一个冷僻的生成对象方式 并不是主流 它主要用于构
  • Python 进阶(四):数据库操作之 MySQL

    1 简介 MySQL 是目前使用最广泛的数据库之一 它有着良好的性能 能够跨平台 支持分布式 能够承受高并发 如果还没有安装 MySQL 下载地址 https dev mysql com downloads mysql 5 7 html 安
  • 安全随机类:SecureRandom

    文章目录 创建 SecureRandom new getInstance 使用 生成随机数 生成随机 byte 数组 nextBytes byte bytes generateSeed int numBytes 参考 Random 类中实现
  • 软件测试 之Web项目实战解析(附全套实战项目教程+视频+源码)

    软件测试之web项目实战 按顺序依次为 搭建测试环境 需求评审 编写测试计划 分析测试点 编写测试用例 用例评审 执行用例提bug 测试报告 一 搭建测试环境 1 搭建测试环境之 常见项目结构模式 2 建测试环境之 服务器介绍 3 搭建测试
  • RCE攻击绕过WAF详解

    今天继续给大家介绍渗透测试相关知识 本文主要内容是RCE攻击绕过WAF详解 免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重后果自负 再次强调 严禁对未授权设备进行渗透测试 一 WAF拦截RCE攻击
  • go读取写入xml文件

    读取xml 想要读取xml文件中的相关信息 xml如下图所示

随机推荐

  • not upgraded解决方法

    sudo apt get dist upgrade
  • Docker教程(二) - 将容器打包成Docker镜像、使用Dockerfile打包镜像

    本文章翻译自Docker的官方教程 有兴趣的同学可以上Docker官网进行play with docker学习 Docker的安装教程请参考这里 未定义 本文翻译自Docker官方教程Doing More With Docker Image
  • signature=d80926ab19028a2cf65e944ce710aef6,[Question] How to create interoperable timestamps?

    I m trying to create a little time stamping service using jsrsasign When creating timestamps these cannot be parsed veri
  • DMA大数据的接收发送与保存

    DMA大数据的接收发送与保存 一 DMA基本介绍 DMA 全称Direct Memory Access 即直接存储器访问 DMA传输将数据从一个地址空间复制到另一个地址空间 当CPU初始化这个传输动作 传输动作本身是由DMA控制器来实现和完
  • HAL库的TIM中断和输入捕获

    硬件 stm32f4xx 软件 keil5 HAL库 1 TIM中断 TIM3 首先先把TIM初始化 官方给的初始化函数是HAL TIM Base Init TIM HandleTypeDef htim 也就意味着我们要首先初始化好TIM
  • Vue2计算属性computed

    vue实例被创建 在触发beforeCreate之后 会做一些事情 其中就包括对computed的梳理 处理 vue会遍历computed配置的所有属性 为每一个属性创建一个watcher 并传入一个函数 传入的函数本质就是computed
  • 有关三次握手,四次挥手的超详细总结!!!

    有关三次握手 四次挥手的超详细总结 我们先来看一下三次握手和四次挥手的示意图 图示为三次握手 图示为四次挥手 一 三次握手和四次挥手的过程 三次握手 TCP建立连接的过程我们称之为3次握手 1 第一次握手 PC1使用一个随机的端口号向PC2
  • elasticsearch installation guide

    UBUNTU 14 04 LTS 安装 elasticseach同步MYSQL表并实现中文搜索 1 下载wget https download elasticsearch org elasticsearch elasticsearch el
  • 2023春计算机系统大作业

    2023春计算机系统大作业
  • Nginx对上游服务的心跳检测健康检查

    nginx对上游服务器的健康检查默认采用惰性策略 可以集成 nginx upstream check module模块来进行主动健康检查 nginx upstream check module支持tcp心跳和http心跳检测 TCP心跳检查
  • AndroidStuio插件开发-适用于jetbrains全家桶

    文章目录 创建项目 创建类 获取文件 解析文件 展示解析内容 写入文件 写了个类似Butter Knife的开发库 但是并没有与其配套的AndroidStudio插件 抽时间研究了以下IDEA的api文档 撸了一个对应的插件 源码在这里 之
  • 在idea中创建javaweb项目

    在idea中新建javaweb项目 一 在idea中新建javaweb项目 二 部署应用程序到tomcat的webapps目录 一 在idea中新建javaweb项目 1 打开idea 选择File gt new gt new projec
  • 提问的智慧

    How To Ask Questions The Smart Way 学习浏览 看到的优质文章留存 转载 仅供个人学习使用 侵删 原文链接 本指南英文版版权为 Eric S Raymond Rick Moen 所有 原文网址 http ww
  • javascript 异步编程

    这可能是个比较深的话题 何谓异步 笼统地说 异步在javascript就是延时执行 严格来说 javascript中的异步编程能力都是由BOM与DOM提供的 如setTimeout XMLHttpRequest 还有DOM的事件机制 还有H
  • JEESITE登录流程简单梳理

    http blog csdn net qinwang gz article details 53306037
  • 网络三种连接方式-地址转换模式

    VMware虚拟机NAT 地址转换模式 转载于 VMware虚拟机三种网络模式详解 NAT 地址转换模式 Linux教程 Linux公社 Linux系统门户网站 二 NAT 地址转换模式 刚刚我们说到 如果你的网络ip资源紧缺 但是你又希望
  • 小程序、微信H5、APP,移动端跨端相互跳转相关规则,2020/11最新总结

    这里只做总结与解释 细则可以去相应官方文档查看 前情提要 其他小程序的appid可以在它的资料里直接查看 所以不是问题 H5 gt 小程序 gt 随便跳 通过微信jssdk openTagList wx open launch weapp
  • ubuntu(20.04)+linux内核(5.17.3)编译内核

    该篇文档可以放心观看 里面的内容是我以便编译内核 一边记录写下的 所以如果按照文档来做 是绝对可以的哈 文章目录 前言 一 安装linux内核 二 开始前的准备工作 三 内核编译 1 将下载好的linux内核解压至 usr src 2 得到
  • 数据透视表右侧字段不见了,怎么办?

    数据透视表右侧字段不见了 怎么办 点击 右键 选择 显示字段列表
  • 网络套接字发送结构体及数据处理

    struct很基础 但是说实话 我还不是很了解 以下是借鉴别人的 转载地址 http blog chinaunix net uid 21372424 id 119782 html 一 最近在做嵌入式系统 与windows的网络通信 由于 这