从两个不同的数据结构将数据插入std :: map <std :: string,int =“”> mymap并通过socket </std :: string,>发送它

时间:2013-09-04 09:15:04

标签: c++ sockets c++11 map

我已经宣布了地图:

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

我想在上面的地图中插入两个值 *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);
        }

2 个答案:

答案 0 :(得分:2)

就像我在评论中所说的那样,任何类型的数据结构都包含指针,文件/套接字句柄等,不能通过网络发送,也不能保存到文件中。至少没有任何marshallingserialization

在你的情况下,它可以简单一半。您需要做的第一件事是发送地图的大小,即其中的条目数。这有助于在接收方重新创建地图。

然后您可以先发送所有密钥,然后发送所有值。发送值很简单,只需将它们放在std::vector中并使用例如{{1}}即可。 std::vector::data获取指向实际数据的指针。发送密钥有点复杂(因为它们可能有不同的长度)。对于密钥,您可以创建一个大小足以容纳所有密钥字符串的固定大小数组,并发送它。或者您可以逐个发送每个密钥,接收方检查字符串终止符。或者逐个发送字符串,首先是字符串的长度,然后是实际的字符串。

答案 1 :(得分:2)

您的解决方案可以简单到发送一个密钥,然后是NUL,然后是NUL后面的值,然后重复,直到您到达终点然后再发送一个NUL。

但你必须自己迭代地图,然后自己重​​建它。