发送"字符串"和" int" var在socket中使用send()方法

时间:2013-09-03 17:49:44

标签: c++ sockets send

在我的下面的代码中,我想通过套接字发送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

即。发生:字

我想在socket中使用send()方法发送它。 如果两者都是intchar那么我可以将它存储到二维数组并发送该数组。 但事实并非如此。

有人可以找出使用套接字中的单个send()发送的方式吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您可以通过stringstream将邮件打包成字符串,然后发送邮件(以字符串长度为前缀)。另一端将读取字符串长度,然后将多个字节读入字符串。然后可以将此字符串输入stringstream以提取数据。

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

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