作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我对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/
我是一名优秀的程序员,十分优秀!