-2

hit->first在我下面的代码中,我想*vit通过套接字发送:

for (std::map < int, std::vector < std::string > >::iterator hit = three_highest.begin(); hit != three_highest.end(); ++hit) {
    //std::cout << hit->first << ":";

    for (std::vector < std::string >::iterator vit = (*hit).second.begin(); vit != (*hit).second.end(); vit++) {
        std::cout << hit->first << ":";
        std::cout << *vit << "\n";

结果:

2:one
3:ff
3:rr
6:fg

即发生:单词

我想在套接字中使用 send() 方法发送它。如果两者都是,int或者char我可以将它存储到二维数组中并发送该数组。但这里不是这样。

有人可以弄清楚使用单send()套接字发送的方式吗?

4

2 回答 2

2

为什么不定义一个包含 int 和 char 数组的数据结构(您必须知道最大值才能定义 char 数组)。接下来,您可以传递此数据结构的数组。或者,也许更紧凑,您可以使用 LV(长度值格式)。因此,您可以有 5:2:one::4:3:ff,即发生:单词中的 num_of_char,后跟实际发生:单词。您可以构建此消息并在一次 send() 调用中发送它。

于 2013-09-03T18:15:53.240 回答
2

您可以通过 a 将消息打包成一个字符串stringstream,然后发送消息(以字符串长度为前缀)。另一端将读取字符串长度,然后将那么多字节读入字符串。然后可以将该字符串输入 astringstream以提取数据。

在伪代码中,发送可能如下所示:

std::ostringstream oss;
for (...) {
    for (...) {
        oss << first << " " << second << "\n";
    }
}
std::vector<char> v(oss.str().c_str(), oss.str().c_str() + oss.str().size());
uint32_t len = v.size();
iovec iv[2] = { { &len, sizeof(len) }, { &v[0], len } };
writev(sock, iv, 2);

接收代码可能如下所示:

uint32_t len;
recv(sock, &len, sizeof(len), 0);
std::vector<char> v(len + 1);
recv(sock, &v[0], len, 0);
v[len] = '\0';
std::string s(&v[0]);
std::istringstream iss(s);
for (;;) {
    for (;;) {
        iss >> first >> second;
    }
}
于 2013-09-03T19:18:39.303 回答