如何将缓冲区从套接字分离到不同的变量?

时间:2018-09-19 07:48:56

标签: c++ string sockets

我正在通过udp套接字连接接收缓冲区。代码是c ++。输出如下:

>>375.5,25.3

,数字之间用逗号分隔,并且不包含空格。每隔100毫秒就会发送一组新的数字。就像这样:

>>375.5,25.3
>>435.6,0.0
>>2500.34,55.2

以此类推。

对于每个新集合,我试图将第一个数字放入var1,将第二个数字放入var2。 var1和var2不是数组。想象一下,我只需要打印以下内容:

>>var1=375.5
  var2=25.3
>>var1=435.6
  var2=0.0

这是我正在使用的代码:

recv_len = recvfrom(s, buff, sizeof(buff), 0, (struct sockaddr *)&si_other, (socklen_t*)&slen);

        if (recv_len== -1)
        {
            printf("Receiving message failed");
            exit(0);
        }
  buff[recv_len] = '\0';


    std::vector<int> vect;

    std::stringstream ss(buff);

    int i;

    while (ss >> i)
    {
        vect.push_back(i);

        if (ss.peek() == ',' || ss.peek() == ' ')
            ss.ignore();
    }

   var1 = vect.at(0);
   var2 = vect.at(1);

   printf("Received packet from %s:%d\nData:%s\n\n",inet_ntoa(si_other.sin_addr),ntohs(si_other.sin_port),buff);

    cout<<var1<<endl;
    cout<<var2<<endl;

我得到的输出是一个错误,大小约为1。(对不起,我没有保存此输出以提供确切的错误输出。我明天将进行编辑。)当我注释掉“ var2 = vect.at(1)”,输出为:

>>Received packet from 127.0.0.1:31029
  Data: 375.5,25.3
  375.5
  0

因此它表明我同时需要两个数字,但不允许我将它们分开。我从这里得到逗号分隔: Parsing a comma-delimited std::string 但给我一个错误。

我只需要在每次出现时都将缓冲区分开:

>>375.5,25.3

出现,输入var1 = 375.5和var2 = 25.3,然后

>>435.6,0.0 

出现,将var1 = 435.6和var2 = 0.0

>>2500.34,55.2

出现,将var1 = 2500.34和var2 = 55.2

,依此类推。

---------------------编辑------------------------- ---

我会从上面忘记的错误是:

>>Terminate called after throwing an instance of 'std::out_of_range'
  what(): vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)

1 个答案:

答案 0 :(得分:1)

您找到的答案适用于整数,而不适用于浮点数。无论如何,这个问题很容易解决。如果您确定缓冲区的格式(即2个浮点数,用逗号分隔,没有空格),则解决方案可能如下所示:

char buff[] = "375.5,25.3";
std::string s(buff);
std::cout << std::stof(s.substr(0, s.find(','))) << std::endl;
std::cout << std::stof(s.substr(s.find(',')+1, s.size())) << std::endl;

您基本上可以只使用substr创建2个子字符串:一个在逗号前,另一个在逗号后,然后使用stof将其转换为浮点值。

如果您需要更强大的功能,请查看at this answer,以获得更完整的代码来分割字符串并捕获stof可能引发的异常。