gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:45:22 26 4
gpt4 key购买 nike

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

最佳答案

你不能。 TCP 是一个流,这就是您所看到的全部。您必须读取缓冲区中的内容并自行解析,同时处理可能多于或少于整个命令的情况。

您的另一个选择虽然麻烦但很简单,就是阻塞从套接字读取 1 字节并在进行时进行解析。

关于c - 如何在每次 TCP 读取时只从 TCP 流中读取单个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25404165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com