不多说废话了,直接上代码
[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]
希望有高手可以给我解答下,这到底是什么原因造成的
好吧,我把字符串赋值那部分代码也粘上吧
[mw_shl_code=c,true]
u8 find(u8 *msg,u8 err,u32 data_len)
{
u32 i=0,start=0;
u8 len=0;
u8* msg_data;
if (data_len>0){
do{
if (*(msg+i) == ' ' & *(msg+i+1) == ' '){
msg_data = mymalloc(SRAMIN,len+1);
mymemcpy(msg_data,msg+start,len+1);
putTCPQmsg(msg_data,err);
i++;
start = i + 1;
len=0;
} else {
len++;
}
}while(i++<data_len-1);
}
return 0;
}
[/mw_shl_code]
然后发现3ms为间隔发送的时候不会出这个问题,
1ms为间隔发送的时候一开始也不出这个问题,随着时间的延长才会出现
是不是说强制转换的(char *)msg的字符串也是需要后面加上' '才能保证strlen读取出来的长度是3?
我在实际测试的时候是对TCP数据包的粘包现象进行拆包处理的,每个包以 为结尾,每次发送的数据是应拆成3个数据包然后依次加入消息队列的,
当发送的间隔为1-2ms时,3w条后会出现该现象,3w条前不会,而当发送间隔为3ms及更长时(也就是 写入消息队列速率=读取消息队列速率 的时候)在2亿byte的数据通信中不会出现这种现象,这是由于什么原理呢?
一周热门 更多>