C++—UDP通信之结构体数组传输问题小结

C++ 专栏收录该内容
17 篇文章 0 订阅

之前一直觉得udp传输很简单,套用就是了,但是自己在进行封装成类,以及发送和接收结构体数组的时候都出现了问题,花了不少时间在这上面纠结,所以在这里一步步记录下自己的问题。

一、一些必要的判断是必不可少的

       比如在发送端打开文件的时候进行判断,判断是否成功打开;

       特别有用的是 接收端的接收是否成功,如果失败返回 错误类型 ,我这次出现的问题就有接收端的buffer小于收到的数据长度,出现缓存长度。如果不写判断语句,接收端就是空白一片,当然也可以打断点一步步过去发现问题,但是这样更快一些。

if ((Ret = recvfrom(ReceivingSocket, buffer, sizeof(buffer), 0, (SOCKADDR*)&SenderAddr, &SenderAddrSize)) == SOCKET_ERROR)
		{
			printf("Error: recvfrom failed with error %d\n", WSAGetLastError());

二、关于结构体数组的发送

       发送给本机进行测试的时候,发送端IP请一定写“127.0.0.1”,不要写电脑的本机IP。(原因模糊懂吧)

       我这次的任务需求是:定义一个结构体类型,需要把txt的数据赋值给结构体,然后把数据里20个时刻区间内的数据依次发出去,因为需要判断,所以就要把所有的结构体存成结构体数组。

       发送端 sendto()函数 也就是个长度和地址的问题,但是很不巧,小菜鸟在这两方面都出了错。

 定义结构体   typedef struct Track_message   { int x;…… } TRKMSG;   // TRKMSG 是一个结构体类型 = struct Track_message

                     TRKMSG databag[MAXLEN];   // 必须要声明一个变量 databag[ ];

         sendto(SendingSocket, p_trcak_target, pack_length, 0, (SOCKADDR*)&ReceiverAddr, sizeof(ReceiverAddr)) 

         char *p_trcak_target = (char *)&databag[i];    // 指针要指向当前结构体数组,就是要发送的这一行数据

          int pack_length = sizeof(TRKMSG);     // 长度必须为一个结构体的长度,注意不是整个结构体数组的长度!!

        列如:sizeof(databag[0])=200; sizeof(databag[10])=2000; 所以长度必须是固定的,写databag 的话就会一直增长,发送的数据太大,接收端缓存一定会报错

接收端不用做什么改动,按照一般流程就可以。

          char buffer[1024] = "0";    memcpy(&target, buffer, sizeof(TRGMSG));


三、excel 转txt ,Unicode 与 文本文件(制表符分割)的区别

      因为C++读取Excel 文件,配置很麻烦,我试了两次就没有成功,所以就直接另存为 txt 读取,但是这个过程中我没有留意除了大问题。

         可以发现Excel在另存为 txt 时有两个格式可以选择,文本文件(制表符分隔)和 Unicode ,其实一般使用的话这两个没有太大差别,保存出来的txt格式也都一样,但是在设置关于存储的时候就出了问题。 

         文本文件(制表符分隔)是一个字符占一个字节;Unicode是一个字符占两个字节;所以在数据量大的时候,Unicode存储空间大概是 制表符间隔 的两倍;我在一步步实现功能的过程中会先导出来一小部分数据进行测试,调试通的话在把所有的数据都存储出来,结果大数据文本错误的保存成了Unicode,而且单步调试的时候也很奇怪,发现读取成功了,但是数据就是没有读到缓存中去。

        总的来说,这个失误主要是因为粗心,不留意;接着就是经验不足;希望自己能再接再厉,好好加油!

四、调试以及细心

           要熟练应用单步调试就行bug排查,而且不要只局限要当前的这一个变量,要看和他相关的其他变量

五、如何输出结构体里面的数组的值,目前暂做遗留吧。

  • 0
    点赞
  • 1
    评论
  • 7
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值