最近的專案用到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了一下...