如何在每次TCP读取时只从TCP流中读取单个命令

时间:2014-08-20 12:00:40

标签: c sockets tcp microcontroller

我对TCP数据流的概念有点困惑。 我有几个可变长度命令,每个命令由回车符(\ r),

终止
 for eg:
command 1: C\r;
command 2: NO\r;
command 3: M1234\r;
command 4: N00\r;

在TCP中,这就像一个连续的数据流,就像这个"C\rNO\rM1234\rN00\r" 我已经设置了检查回车('\r')的条件,一旦我读回车票,我就会在local_buff中复制我的数据并调用函数'Transmit_Data()'来处理 基于命令的数据。

我面临的问题是在tcp的读取功能我怎样才能确保在单个读取中我只读取一个回车终止命令。 例如: 在第一次阅读中,我可能会获得数据"C\r""C\rNO""C\rNO\rM1"或任何其他序列 最新解决方案是什么,以便我在每次读取后都不会读取任何内容,只有在下次读取时才会读取扩孔数据。

如果我正确地做事,请查看我的代码

while (1)
            {
                ercd = tcp_rcv_dat(cepid, cep[i].rcv_buf, sizeof(cep[i].rcv_buf), TMO_FEVR);
                /* error or fin check */
                if ((ercd < 0) || (ercd == 0))
                {
                    break;
                }
                char_posit = strchr(cep[i].rcv_buf, '\r');
                  if (char_posit != NULL)                     
                   {
                     bytes_copy = char_posit  - cep[i].rcv_buf;
                     memcpy(local_buff,cep[i].rcv_buf,bytes_copy);
                     Transmit_Data(0,cepid,i);
                     memset(cep[i].rcv_buf,0,sizeof(cep[i].rcv_buf));
                    } 
             }

2 个答案:

答案 0 :(得分:4)

你不能。 TCP是一个流,你所见过的都是。你必须阅读缓冲区中的内容并自己解析,同时应对可能有多于或少于整个命令。

你的另一个选择,这是令人讨厌但很容易的,只是阻止从套接字读取1个字节并随时解析。

答案 1 :(得分:0)

它不是一个收集所有数据的解决方案,用像strtok()之类的C函数拆分它们,把它放在堆栈或缓冲区中,然后处理它吗?

C Cut Strings/Char Arrays