【问题标题】:Sending "string" and "int" var using send() method in socket在套接字中使用 send() 方法发送“string”和“int”var
【发布时间】:2013-09-07 01:17:41
【问题描述】:

在下面的代码中,我想通过套接字发送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() 方法发送这个。 如果两者都是intchar,那么我可以将它存储到二维数组中并发送该数组。 但这里不是这样。

有人能弄清楚在套接字中使用单个send() 发送此信息的方式吗?

【问题讨论】:

    标签: c++ sockets send


    【解决方案1】:

    您可以通过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;
        }
    }
    

    【讨论】:

    • 谢谢,我需要声明iovec或者你所做的会直接起作用吗?我不明白iovec iv[2] = { { &amp;len, sizeof(len) }, { &amp;v[0], len } };。抱歉,我之前不知道iovec
    • 谢谢,上面写着The writev() system call works just like write(2) except that multiple buffers are written out. 。它与套接字中的 send() 调用相同吗?
    【解决方案2】:

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

    【讨论】:

    • 谢谢:但5:2:one::4:3:ff, that is num_of_char in occurance:word 我听不懂。而是 num_of_char 我想发送出现次数,即单词出现的次数!
    • 这是一种发送信息并将每个发生值存储为一组的紧凑方式。基本上,计算出现次数、“:”和实际字符串所占用的字符数。然后在前面加上。这形成了一组。这样,当对方收到此消息时,它会读取该值,直到它遇到第一个“:”,并知道该集合需要读取多少字符。因此,“5:2:one”意味着有 5 个字符,因此接收者可以从中读取“2:one:”。之后就可以查看下一个LV集了。
    • 我觉得这对我来说会很痛苦。因为那时我想在 sql 数据中分别插入出现和单词。你认为你描述的方式会进一步帮助我吗?
    • 所以,接收套接字是否将其作为 SQL 数据插入。基本上,它是从发送套接字获取消息然后调用 SQL 吗?如果是这种情况,那么我将只使用一个包含 int 和 char 的 DS 数组。那会更简单。
    • 我正在执行从 php 文件接收套接字。使用 shell_exec() 函数。我在接收套接字时得到的结果,我在 PHP 页面中获取,然后将其插入数据库。所以接收socket的array会让我工作方便!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2023-03-19
    • 1970-01-01
    • 2012-12-18
    • 2017-08-26
    • 2016-04-28
    • 2013-11-13
    相关资源
    最近更新 更多