Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “发送”;“字符串”;及;int";在套接字中使用send()方法的var_C++_Sockets_Send - Fatal编程技术网

C++ “发送”;“字符串”;及;int";在套接字中使用send()方法的var

C++ “发送”;“字符串”;及;int";在套接字中使用send()方法的var,c++,sockets,send,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 &l

在下面的代码中,我想通过套接字发送
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";
i、 事件:单词

我想使用套接字中的send()方法发送此文件。 如果两者都是
int
char
,那么我可以将其存储到二维数组中并发送该数组。 但在这里情况并非如此


有人能想出在套接字中使用single
send()
发送的方法吗?

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

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

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

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;
    }
}
std::ostringstream oss;
对于(…){
对于(…){
oss第二;
}
}

谢谢:但是
5:2:one::4:3:ff,那是发生中的字符数:word
我听不懂。而是我要发送的字符数,即单词出现的次数!这是一种发送信息并将每个事件:值存储为一组的紧凑方式。基本上,计算发生次数、“:”和实际字符串占用的字符数。然后把它加在前面。这是一套。这样,当另一方收到此消息时,它将读取该值,直到它到达第一个“:”并知道此集合需要读取多少字符。因此,“5:2:1”意味着有5个字符,因此接收者可以从中读取“2:1:”。在那之后,它可以看下一套LV。我想这对我来说是非常痛苦的。因为我想在sql数据中分别插入引用和单词。您认为您所描述的方式会对我有进一步的帮助吗?那么,接收套接字是否将其作为SQL数据插入。基本上,它是从发送套接字获取消息,然后调用SQL吗?如果是这样的话,那么我将只使用一个包含int和char的DS数组。这会更简单。我正在执行从php文件接收套接字。使用shell_exec()函数。我在接收套接字时得到的结果是在PHP页面中获取套接字,然后将其插入数据库。所以,在接收插座阵列将使我方便的工作!谢谢,我需要声明
iovec
还是您所做的将直接起作用?我不明白iovec iv[2]={{&len,sizeof(len)},{&v[0],len}。对不起,我以前不知道iovec!谢谢,它说,
writev()系统调用的工作原理与write(2)一样,只是写入了多个缓冲区。它是否与套接字中的send()调用相同?
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;
    }
}