【问题标题】:How to read only single command from TCP stream in every TCP read如何在每次 TCP 读取中仅从 TCP 流中读取单个命令
【发布时间】:2014-08-20 20:17:01
【问题描述】:

我对 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" 或任何其他序列 有什么解决方案,这样我就不会在每次读取 \r 之后读取任何内容,并且只有在下一次读取时才应该读取扩孔数据。

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

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));
                    } 
             }

【问题讨论】:

    标签: c sockets tcp microcontroller


    【解决方案1】:

    你不能。 TCP 是一个流,这就是你所看到的。您必须读取缓冲区中的内容并自己进行解析,以应对可能多于或少于整个命令的情况。

    你的另一个选择,虽然讨厌但很简单,就是阻塞从套接字读取 1 个字节并随时解析。

    【讨论】:

      【解决方案2】:

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

      C Cut Strings/Char Arrays

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-20
        • 2015-02-05
        • 1970-01-01
        • 2023-01-31
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多