在我的下面的代码中,我想通过套接字发送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()方法发送它。
如果两者都是int
或char
那么我可以将它存储到二维数组并发送该数组。
但事实并非如此。
有人可以找出使用套接字中的单个send()
发送的方式吗?
答案 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;
}
}