簡體   English   中英

將數據插入std :: map <std::string, int> mymap來自兩個不同的數據結構並通過套接字發送

[英]Insert data into std::map <std::string, int> mymap from two different data structure and sending it via socket

我已宣布地圖:

std::map <std::string, int> mymap;

我想在上面的map *vithit->first插入兩個值,然后通過套接字發送和接收。

我的代碼:

for (std::map < int, std::vector < std::string > >::iterator hit = three_highest.begin(); hit != three_highest.end(); ++hit) {

for (std::vector < std::string >::iterator vit = (*hit).second.begin(); vit != (*hit).second.end(); vit++) {
        std::cout << hit->first << ":";
        std::cout << *vit << "\n";
        mymap.insert( std::pair<std::string,int> (*vit,hit->first)); //Is it correct way
       }
    }

//然后通過套接字發送

if ((bytecount = send(*csock, mymap ,  sizeof(mymap), 0)) == -1) { // I think this is wrong, Can someone correct it?
    fprintf(stderr, "Error sending data %d\n", errno);
    goto FINISH;
    }

並在接收端如何獲得這兩個變量?

std::map <std::string, int> mymap;
if((bytecount = recv(hsock, mymap, sizeof(mymap), 0))== -1){   //Needs help here also

// getting mymap->first, mymap->second.

        fprintf(stderr, "Error receiving data %d\n", errno);
        }

就像我在評論中所說的那樣,任何類型的數據結構都包含指針,文件/套接字句柄等,不能通過網絡發送或保存到文件中。 至少沒有任何形式的編組序列化

在你的情況下,它可以簡單一半。 您需要做的第一件事是發送地圖的大小,即其中的條目數。 這有助於在接收方重建地圖。

然后你可以先發送所有的密鑰,然后是所有的值。 發送值很簡單,只需將它們放在std::vector並使用例如std::vector::data來獲取指向實際數據的指針。 發送密鑰有點復雜(因為它們可能有不同的長度)。 對於密鑰,您可以創建一個大小足以容納所有密鑰字符串的固定大小數組,並發送它。 或者您可以逐個發送每個密鑰,接收方檢查字符串終止符。 或者逐個發送字符串,首先是字符串的長度,然后是實際的字符串。

您的解決方案可以簡單到發送一個密鑰,然后是NUL,然后是NUL后面的值,然后重復,直到您到達結束然后發送額外的NUL。

但是你必須自己迭代地圖,然后自己重​​建它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM