将数据插入的std ::地图 从两个不同的数据结构和mymap中经由套接字发送它(Insert

2019-10-18 14:44发布

我宣布地图:

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

Answer 1:

就像我在我的评论说,任何一种含有指针,文件/套接字句柄和类似的数据结构,无法通过网络发送,或者保存到文件。 至少在没有任何形式的编组或序列化 。

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

这时你可以先发送所有的按键,然后所有的值。 发送的值很简单,只需将它们放在一个std::vector ,并使用如std::vector::data获取指向实际数据。 发送键是有点复杂(因为它们可以具有不同的长度)。 对于重点,你可以做固定大小的数组足够大,以适应所有关键字符串数组,并发送。 或者你可以通过一个与字符串结束接收方检查发送的每个关键之一。 或由一个发送字符串之一,第一后跟实际字符串字符串的长度。



Answer 2:

您的解决方案可以像发送键,然后按一个NUL然后是NUL值,并重复直到你到达终点,然后发送一个额外的NUL这样简单的事情。

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



文章来源: Insert data into std::map mymap from two different data structure and sending it via socket