C UDP通訊之結構體陣列傳輸問題小結

2021-09-24 20:57:40 字數 1473 閱讀 5589

之前一直覺得udp傳輸很簡單,套用就是了,但是自己在進行封裝成類,以及傳送和接收結構體陣列的時候都出現了問題,花了不少時間在這上面糾結,所以在這裡一步步記錄下自己的問題。

比如在傳送端開啟檔案的時候進行判斷,判斷是否成功開啟;

特別有用的是 接收端的接收是否成功,如果失敗返回 錯誤型別 ,我這次出現的問題就有接收端的buffer小於收到的資料長度,出現快取長度。如果不寫判斷語句,接收端就是空白一片,當然也可以打斷點一步步過去發現問題,但是這樣更快一些。

if ((ret = recvfrom(receivingsocket, buffer, sizeof(buffer), 0, (sockaddr*)&senderaddr, &senderaddrsize)) == socket_error)

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));

因為c++讀取excel 檔案,配置很麻煩,我試了兩次就沒有成功,所以就直接另存為 txt 讀取,但是這個過程中我沒有留意除了大問題。

可以發現excel在另存為 txt 時有兩個格式可以選擇,文字檔案(製表符分隔)和 unicode ,其實一般使用的話這兩個沒有太大差別,儲存出來的txt格式也都一樣,但是在設定關於儲存的時候就出了問題。 

文字檔案(製表符分隔)是乙個字元佔乙個位元組;unicode是乙個字元佔兩個位元組;所以在資料量大的時候,unicode儲存空間大概是 製表符間隔 的兩倍;我在一步步實現功能的過程中會先導出來一小部分資料進行測試,除錯通的話在把所有的資料都儲存出來,結果大資料文字錯誤的儲存成了unicode,而且單步除錯的時候也很奇怪,發現讀取成功了,但是資料就是沒有讀到快取中去。

總的來說,這個失誤主要是因為粗心,不留意;接著就是經驗不足;希望自己能再接再厲,好好加油!

要熟練應用單步除錯就行bug排查,而且不要只侷限要當前的這乙個變數,要看和他相關的其他變數

7 結構體之結構體陣列

結構體這塊本來學著沒有什麼問題的,但是,有時候的學習不知道怎麼的,可能是課程進度有點快,會讓自己把前面的知識點與現學的聯絡起來,從而使自己迷惑起來。好了,先說問題 在前面的指標的學習中,我一直過於執著於 p是以p的值為位址所指向的值,並且 p為乙個具體的數值。以至於在學到結構體陣列時,比如 parr...

C 通訊,結構體和byte陣列互轉

在c 進行udp或者tcp ip通訊時,經常要用到byte陣列來傳遞資訊。一開始,我是使用bitconverter和encoding來進行轉換。後來經過大神指導,其實一切不必那麼麻煩。只需將要傳送的資訊封裝成結構體,使用c 自帶的乙個轉換類便可輕鬆搞定。首先建立乙個結構體 必須引用的庫using s...

通訊錄 結構體指標陣列實現

實現功能有 1.新建,新增聯絡人,在達到上限時輸出book full!儲存上限可以通過改變巨集定義裡maxsize的值來實現,為了測試方便,目前的 maxsize 3 2.檢視當前通訊錄內所有聯絡人 3.以名字為索引查詢聯絡人 4.以名字為索引修改聯絡人 5.以名字為索引刪除聯絡人 6.按名字asc...