【问题标题】: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 并通过套接字发送
【发布时间】:2013-09-04 09:15:04
【问题描述】:

我已经声明了地图:

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

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

//然后通过socket发送

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

【问题讨论】:

  • 您不能发送/接收任何复杂的数据结构,例如网络上的指针。指针只在你得到指针的进程中有效,其他进程不能使用该指针。
  • 你不能这样做。您必须创建一个协议并根据该协议发送数据。你不能说“发送这个数据结构”并在另一边接收它。至少如果 D.S. 不仅仅是一个没有分配动态内存的结构。
  • 如果您认为要通过此处所写的套接字发送 std::map,请三思。您需要发送数据in地图并在另一边重建它。
  • @JoachimPileborg 恶作剧
  • @P0W:同一个研究所!

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


【解决方案1】:

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

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

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

【讨论】:

  • 对于简单的数组或 var 我可以弄清楚编组。但是对于这种例子,我从来没有遇到过,我也找不到类似的例子!
  • @Catty 然后你需要创建一个足够大的字节数组来保存所有数据,然后将映射编组到该数组中,另一方面你需要取消编组它。除了在我的答案中实际发送,您可以执行相同的操作,但将其放入数组中。
  • 密钥和字符串不能一起发送吗?你能给我实现你的方法吗?这将是很大的帮助!
【解决方案2】:

您的解决方案可以很简单,例如先发送一个键,后跟一个 NUL,然后发送一个值,后跟一个 NUL,然后重复此操作,直到您到达最后,然后再发送一个额外的 NUL。

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

【讨论】:

  • NUL 以重复的方式??我只想用一个 send() 发送它
  • @Catty 因为您永远无法知道随时可以发送多少数据,所以您永远无法保证一次发送即可发送所有数据。
  • 即使小于~512B?我认为是 TCP 数据包限制!
  • @Catty 永远。你永远不知道发送的缓冲区有多少。
猜你喜欢
  • 2019-10-06
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2013-09-11
  • 2013-12-15
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
相关资源
最近更新 更多