不多说废话了,直接上代码
[mw_shl_code=c,true]
u8 tcp_send(void)
{
u8 err;
u8 *msg = OSQPend(q_msg,0,&err);
if (msg!=NULL){
u32 len = strlen((char *) msg);
printf("%d
",len);
err = netconn_write(tcp_clientconn, msg, len, NETCONN_COPY);
if(err != ERR_OK){
myfree(SRAMIN,msg);
printf("发送失败
");
return 0;
}
} else {
printf("%s
","等待数据");
}
myfree(SRAMIN,msg);
return 1;
}
[/mw_shl_code]
其中len的获取在1毫秒的发送状况下无法准确的获取长度,并且在出现该情况以后单条发送依然存在该问题,
下面是我发送的数据(每行数据以0D 0A结尾)
通信数据
得出来的len都是30,即全是第一组数据的长度
若我使用自己编写的以0D为结尾获取长度的函数,则能够准确获取其长度如下:
[mw_shl_code=c,true]
u8 getSize(u8 *msg){
u8 len=0;
while (*msg++!='
') len++;
return len;
}
[/mw_shl_code]
希望有高手可以给我解答下,这到底是什么原因造成的
是不是说强制转换的(char *)msg的字符串也是需要后面加上' '才能保证strlen读取出来的长度是3?
我在实际测试的时候是对TCP数据包的粘包现象进行拆包处理的,每个包以 为结尾,每次发送的数据是应拆成3个数据包然后依次加入消息队列的,
当发送的间隔为1-2ms时,3w条后会出现该现象,3w条前不会,而当发送间隔为3ms及更长时(也就是 写入消息队列速率=读取消息队列速率 的时候)在2亿byte的数据通信中不会出现这种现象,这是由于什么原理呢?
一周热门 更多>