我已经宣布了地图:
std::map <std::string, int> mymap;
我想在上面的地图中插入两个值
*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);
}
答案 0 :(得分:2)
就像我在评论中所说的那样,任何类型的数据结构都包含指针,文件/套接字句柄等,不能通过网络发送,也不能保存到文件中。至少没有任何marshalling或serialization。
在你的情况下,它可以简单一半。您需要做的第一件事是发送地图的大小,即其中的条目数。这有助于在接收方重新创建地图。
然后您可以先发送所有密钥,然后发送所有值。发送值很简单,只需将它们放在std::vector
中并使用例如{{1}}即可。 std::vector::data
获取指向实际数据的指针。发送密钥有点复杂(因为它们可能有不同的长度)。对于密钥,您可以创建一个大小足以容纳所有密钥字符串的固定大小数组,并发送它。或者您可以逐个发送每个密钥,接收方检查字符串终止符。或者逐个发送字符串,首先是字符串的长度,然后是实际的字符串。
答案 1 :(得分:2)
您的解决方案可以简单到发送一个密钥,然后是NUL,然后是NUL后面的值,然后重复,直到您到达终点然后再发送一个NUL。
但你必须自己迭代地图,然后自己重建它。