UDP傳送和接受結構體結構的訊息 Qt

2021-08-17 12:06:12 字數 2250 閱讀 4469

最近的專案用到udp接收結構體,以為和普通的傳送字串的一樣,沒想到我還是太天真。要能夠接收或者傳送結構體,乙個很重要的知識點是:結構體位元組對齊。廢話不多說,小課堂開始了!

結構體對齊

參考許多計算機系統對基本資料型別合法的進行了一些限制,要求某種型別物件的位址必須是某個值(通常是2,4 和8)的倍數。這種對齊簡化了形成處理器與儲存系統之間的介面的硬體設計。當資料結構為結構體時,為了滿足這種資料對齊的機制,編譯器可能需要在結構體的字段的分配中插入間隙--向結構體中最大的元素對齊。

typedef struct   

s;

看上面的結構體,在沒有資料對齊的情況下,size()=1+4*2+8=17位元組。

再編譯器資料對齊處理後,他的結構大小變成了24位元組(向結構體中最大的元素對齊),記憶體布局為

這個就是為什麼我強轉後,結構體中的部分資料是亂碼的。

udp傳送和接收結構體訊息

知道結構體的資料對齊的處理後,我們知道不能進行強轉了,那麼該怎麼做呢?

我的做法是:將struct中的元素按位元組大小乙個個的存放到qbytearray中,qbytearray是連續的,接收時按大小再取出來就可以了。

直接上**:

服務端(傳送資料)

#include #include#include#include#include#define byte unsigned char

struct test_data;

class udpserver : public qwidget

;#endif // udpserver_h

#include "udpserver.h"

#include#includeudpserver::udpserver(qwidget *parent)

: qwidget(parent)

void udpserver::startbtnclicked()

else

}void udpserver::timeout()

客戶端接收資料

#ifndef udpclient_h

#define udpclient_h

#include #include#include#define byte unsigned char

struct test_data;

class udpclient : public qwidget

;#endif // udpclient_h

#include "udpclient.h"

#include#include#includeudpclient::udpclient(qwidget *parent)

: qwidget(parent)

}void udpclient::datareceived()

}

在聽取網友意見後,發現將結構體一位元組對齊後,操作真的是非常簡單。

結構體一位元組對齊:

#pragma pack(1)  //指定一位元組對齊

struct test_data;

#pragma pack() //取消指定對齊,恢復預設對齊

直接傳送或接收

data.inumber=1;

strcpy(data.arrchresult,"hello");

strcpy(data.arrchcode,"0x29");

data.boutlimit_flag=true;

data.imark=200;

data.byteresulttype=23;

//傳送

udpsocket->writedatagram((char *)&data,sizeof(data),qhostaddress::broadcast,port);

test_data datagram; 

//接收

udpsocket->readdatagram((char*)&datagram,sizeof(datagram));

Linux socket 傳輸和接受結構體

linux程式設計 linux socket send and recevie structure 最近在開發乙個linux下的聊天軟體,好久沒有做c語言的開發了,感覺到很多東西已經生疏了,這下又碰到用socket傳遞結構體的問題,google了一下,發現也有不少朋友遇到同樣的問題,所以就打算寫出自...

socket傳送結構體

客套話不說了 socket中的send函式可以傳送字串,不能直接傳送結構體,自己理解 結構體即記憶體中一段連續的記憶體,這樣send中可以傳送結構體指標 上 功能 客戶端傳送給服務端乙個結構體,服務端返回客戶端一字串 客戶端 client.c include include include incl...

Linux傳送結構體

linux網路通訊 linux下多客戶端聊天軟體 linux程式設計 linux socket send and recevie structure 最近在開發乙個linux下的聊天軟體,好久沒有做c語言的開發了,感覺到很多東西已經生疏了,這下又碰到用socket傳遞結構體的問題,google了一下...