国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QT通過TCP協(xié)議發(fā)送結(jié)構(gòu)體數(shù)據(jù)

這篇具有很好參考價值的文章主要介紹了QT通過TCP協(xié)議發(fā)送結(jié)構(gòu)體數(shù)據(jù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

做上位機的時候下發(fā)數(shù)據(jù),數(shù)據(jù)是一個結(jié)構(gòu)體,這里就闡述一下怎么通過TCP協(xié)議發(fā)送結(jié)構(gòu)體。
我自己寫的時候主要通過兩種方式,一種是memcpy,另一種是用QDataStream。


先在mainwindow.h頭文件中定義結(jié)構(gòu)體:

    struct EDWINWZY
    {
        char name='A';
        int age=1;

    }edwinwzy;

1. memcpy方式

1.1 發(fā)送整個結(jié)構(gòu)體

函數(shù)原型為void *memcpy(void *destin, void *source, unsigned n);函數(shù)的功能是從源內(nèi)存地址的起始位置開始拷貝若干個字節(jié)到目標內(nèi)存地址中,即從源source中拷貝n個字節(jié)到目標destin中

     //定義bit流
     QByteArray transfer;

     //使用memcpy之前要分配內(nèi)存空間
     transfer.resize(sizeof(struct EDWINWZY));
     //data.resize(sizeof(edwinwzy));//寫法和上面一句效果一樣

     //內(nèi)存拷貝
     memcpy(transfer.data(),&edwinwzy,sizeof(edwinwzy));

     //發(fā)送比特流數(shù)據(jù)
     tcpSocket->write(transfer);

這種方式似乎就定死了只能發(fā)送結(jié)構(gòu)體大小的數(shù)據(jù),但其實不然,我可以通過QByteArray類的成員函數(shù)append來添加一個乃至多個字節(jié)的數(shù)據(jù)。
下面的append函數(shù)中備選的參數(shù)類型名就說明了很多,我可以添加單個字符,也可以添加n個同一個字符,也可以添加另外一個QByteArray的數(shù)據(jù),即一串比特流數(shù)據(jù),亦可以添加QString類型的數(shù)據(jù)。
QT通過TCP協(xié)議發(fā)送結(jié)構(gòu)體數(shù)據(jù),Qt學習筆記,qt,tcp/ip,開發(fā)語言

1.2 發(fā)送部分數(shù)據(jù)

那這是在發(fā)送完一整個結(jié)構(gòu)體之后再添加數(shù)據(jù),如果我想單獨一個一個發(fā)結(jié)構(gòu)體的變量呢?
那其實直接用append就可以了。

    //定義bit流
    QByteArray transfer;

    transfer.append(edwinwzy.name);
    transfer.append(edwinwzy.age);

    transfer.append('\n');
    //發(fā)送比特流數(shù)據(jù)
    tcpSocket->write(transfer);

有個要注意的是,有時候我最后不加換行符,接收端可能會出現(xiàn)無法顯示的情況。這個我只在書中TCPClient項目中出現(xiàn)過,我用串口轉(zhuǎn)網(wǎng)口來接收網(wǎng)口的數(shù)據(jù),在串口端接收到的數(shù)據(jù)都是正常的。

2. QDataStream

這個就類似于C++ 的std::cout了。
不過發(fā)送的數(shù)據(jù)有兩種情況。

2.1 符號<<

第一種情況是直接用<<符號進行發(fā)送,這種發(fā)送會額外發(fā)送幾個字節(jié)數(shù)據(jù)用來表示我發(fā)送的數(shù)據(jù)所占的字節(jié)數(shù)。


	QByteArray tranferdata;
 	//后面這個QIODevice什么的也可以不選擇添加。
    QDataStream out(&tranferdata,QIODevice::WriteOnly|QIODevice::Append);
	char A=a,B=b,C=c,D=d;
	out<<A<<B<<C<<D;
	tcpSocket->write(transfer);

實際上我們收到的字節(jié)數(shù)據(jù)用應該是 04 61 62 63 64,而我們其實只要后面的四個abcd的ascii碼數(shù)據(jù),那這個方法就有點問題了。

2.2 wrieteRawData

下面這個寫原始數(shù)據(jù)的writeRawData函數(shù)就解決了問題

如果我們要發(fā)送其他類型數(shù)據(jù)(不是char類型),那我們使用這個函數(shù)的時候最好做一個強制類型轉(zhuǎn)換。


	QByteArray tranferdata;
 	//后面這個QIODevice什么的也可以不選擇添加。
    QDataStream out(&tranferdata,QIODevice::WriteOnly|QIODevice::Append);
    int A=91,B=92;
    out.writeRawData((char*)&A,sizeof(A));
    out.writeRawData((char*)&B,sizeof(B));
	tcpSocket->write(transfer);

這種寫法就解決了多發(fā)送字節(jié)的問題,只不過因為這里AB是以int舉例,所以它們分別占4字節(jié)。
收到的數(shù)據(jù)就應該為 00 00 00 61 00 00 00 62

總結(jié)

這篇博客主要針對TCP發(fā)送結(jié)構(gòu)體數(shù)據(jù)遇到的問題進行了歸納,發(fā)單個以及發(fā)部分情況都可以實現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-601906.html

到了這里,關(guān)于QT通過TCP協(xié)議發(fā)送結(jié)構(gòu)體數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • C++ Qt TCP協(xié)議,處理粘包、拆包問題,加上數(shù)據(jù)頭來處理

    目錄 前言: 場景: 原因: 解決: 方案2具體細節(jié): 純C++服務端處理如下: Qt客戶端處理如下: ? ? ? ? tcp協(xié)議里面,除了心跳檢測是關(guān)于長連接操作的處理,這個在前一篇已經(jīng)提到過了,這一篇將會對tcp本身的一個問題,進行處理:那就是做網(wǎng)絡通信大概率會遇到的問題

    2024年02月04日
    瀏覽(22)
  • QT基于TCP協(xié)議實現(xiàn)數(shù)據(jù)傳輸以及波形繪制——安卓APP及Windows程序雙版本

    QT基于TCP協(xié)議實現(xiàn)數(shù)據(jù)傳輸以及波形繪制——安卓APP及Windows程序雙版本

    文章代碼有非常非常之詳細的解析!??!諸位可放心食用 這個玩意我做了兩個,一個是安卓app,一個是Windows程序。代碼并非全部都是由我從無到有實現(xiàn),只是實現(xiàn)了我想要的功能。多虧了巨人的肩膀,開源萬歲?。。?我把程序放到GitHub上,需要的可自取。 安卓app:? ?mai

    2024年02月15日
    瀏覽(17)
  • 【Qt網(wǎng)絡編程】實現(xiàn)TCP協(xié)議通信

    【Qt網(wǎng)絡編程】實現(xiàn)TCP協(xié)議通信

    傳輸控制協(xié)議(TCP,Transmission Control Protocol)是 一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議 ,由IETF的RFC 793 定義。 TCP建立連接前,需要進行三次握手,如下圖所示: TCP斷開連接前,需要進行四次揮手,如下圖所示: Qt中提供了QTcpSocket類和QTcpServer類分別用于創(chuàng)

    2024年02月16日
    瀏覽(22)
  • C#向指定的ip地址通過TCP/IP協(xié)議發(fā)送和接受信息

    需要使用Socket類來創(chuàng)建和連接TCP/IP套接字,并使用Send和Receive方法來發(fā)送和接收數(shù)據(jù)。還需要引用System.Net和System.Net.Sockets命名空間。 以下是一個示例代碼,它發(fā)送一個字符串消息到指定的IP地址和端口,并接收返回消息。 了解更多C#可以訪問C#的官方教程 本文也參考了C#的官

    2024年02月07日
    瀏覽(28)
  • QT-通過tcp傳輸文件和文本消息

    QT-通過tcp傳輸文件和文本消息

    在建立連接的基礎(chǔ)上增加了發(fā)送文件的功能,在接收端和發(fā)送端定義了一個枚舉類型,用于判別發(fā)送的是文件還是文本消息 客戶端ui 1.獲取端口號和ip地址,進行連接,再次點擊即可斷開連接 2.點擊發(fā)送消息按鈕,獲取文本框內(nèi)容,將消息發(fā)送出去,其中type為文本消息類型

    2024年02月03日
    瀏覽(13)
  • QT中發(fā)送結(jié)構(gòu)體占用字節(jié)相關(guān)問題

    最近通過上位機發(fā)送數(shù)據(jù)的時候,針對收到的數(shù)據(jù)突然多出幾個bit產(chǎn)生了疑問。用sizeof來看占據(jù)的字節(jié)大小,發(fā)現(xiàn)和實際應該發(fā)送的不對。后面查閱了相關(guān)資料,理解了這一部分原因,這里做一個記錄。 錯誤想法: 結(jié)構(gòu)體大小8+2+2=12個字節(jié) 原因: 計算結(jié)構(gòu)體大小時需要考慮

    2024年02月15日
    瀏覽(16)
  • Qt5學習筆記:Qt兩個窗口(Widget)間傳遞數(shù)據(jù)

    0x01 原理介紹 Qt兩個窗口之間傳遞數(shù)據(jù)實際上還是利用了信號與槽的概念來實現(xiàn)。 本質(zhì)上講,我們只需要實現(xiàn)A窗口發(fā)射信號,B窗口槽函數(shù)響應信號即可。 首先我們在A窗口的頭文件中定義發(fā)射的信號: 然后在B窗口的頭文件中定義槽函數(shù): 最后我們需要將信號與槽連接起來,

    2024年02月13日
    瀏覽(30)
  • QT學習筆記-開發(fā)環(huán)境編譯Qt MySql數(shù)據(jù)庫驅(qū)動與交叉編譯Qt MySql數(shù)據(jù)庫驅(qū)動

    QT學習筆記-開發(fā)環(huán)境編譯Qt MySql數(shù)據(jù)庫驅(qū)動與交叉編譯Qt MySql數(shù)據(jù)庫驅(qū)動

    如果需要在QT程序中實現(xiàn)與MySQL數(shù)據(jù)庫的交互,那么必不可少的一環(huán)就是對Qt MySql數(shù)據(jù)庫驅(qū)動的編譯。 操作系統(tǒng):Windows10 專業(yè)版 64位 Qt版本:Qt 5.15.2 開發(fā)環(huán)境Qt安裝路徑:D:Qt 交叉編譯服務器:Ubuntu 18.4 交叉編譯服務器Qt安裝路徑:/opt/Qt 目標芯片:rk3568 目標平臺:arm64 Qt安裝

    2024年02月11日
    瀏覽(44)
  • 基于TCP/IP協(xié)議的網(wǎng)絡攝像頭的QT項目

    基于TCP/IP協(xié)議的網(wǎng)絡攝像頭的QT項目

    目錄 項目簡述: 1.服務器 ?步驟一:首先搭建一個基本的服務器框架。 ?1.初始化服務器的函數(shù)主體 ?2.等待連接 步驟二:數(shù)據(jù)庫的使用,本次項目使用的Sqlite3數(shù)據(jù)庫 1.數(shù)據(jù)庫初始化 2.登錄時使用數(shù)據(jù)庫? 3.注冊時使用數(shù)據(jù)庫 步驟三:攝像頭的調(diào)用與數(shù)據(jù)傳輸 1.V4L2框架的使

    2024年02月03日
    瀏覽(28)
  • QTday4(鼠標事件和鍵盤事件/QT實現(xiàn)連接TCP協(xié)議)

    QTday4(鼠標事件和鍵盤事件/QT實現(xiàn)連接TCP協(xié)議)

    筆記 時鐘繪制 ?

    2024年02月15日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包