[英]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 *vit
和hit->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.