初级会员

- 积分
- 50
- 金钱
- 50
- 注册时间
- 2015-10-27
- 在线时间
- 1 小时
|
5金钱
对TCP协议不太了解,但是任务需要做一个用tcp传2640的jpeg图像(串口太慢)
遇到以下一些问题
200M的jpeg图像大概在90K左右,目前TCP_SND_BUF 是5840 B
所以要分多次发送,所以我修改了tcp_server_demo.c的轮询函数
if(tcp_server_flag&(1<<7))
{
while(remsize)
{
if(remsize<=TCP_SND_BUF)
{
es->p=pbuf_alloc(PBUF_TRANSPORT,remsize,PBUF_POOL);
pbuf_take(es->p,tcp_server_sendbuf+data_blk_offset*TCP_SND_BUF,remsize);
tcp_server_senddata(tpcb,es);
if(es->p!=NULL)
pbuf_free(es->p);
remsize=0;
}
else
{
es->p=pbuf_alloc(PBUF_TRANSPORT,TCP_SND_BUF,PBUF_POOL);
pbuf_take(es->p,tcp_server_sendbuf+data_blk_offset*TCP_SND_BUF,TCP_SND_BUF);
tcp_server_senddata(tpcb,es);
if(es->p!=NULL)
pbuf_free(es->p);
data_blk_offset++;
remsize-=TCP_SND_BUF;
}
}
tcp_server_flag&=~(1<<7);
}
|
执行这段,会产生错误,assertion : p->ref > 0
我在后面加了一句 tcp_output(tpcb);
if(tcp_server_flag&(1<<7))
{
while(remsize)
{
if(remsize<=TCP_SND_BUF)
{
es->p=pbuf_alloc(PBUF_TRANSPORT,remsize,PBUF_POOL);
pbuf_take(es->p,tcp_server_sendbuf+data_blk_offset*TCP_SND_BUF,remsize);
tcp_server_senddata(tpcb,es);
if(es->p!=NULL)
pbuf_free(es->p);
remsize=0;
}
else
{
es->p=pbuf_alloc(PBUF_TRANSPORT,TCP_SND_BUF,PBUF_POOL);
pbuf_take(es->p,tcp_server_sendbuf+data_blk_offset*TCP_SND_BUF,TCP_SND_BUF);
tcp_server_senddata(tpcb,es);
if(es->p!=NULL)
pbuf_free(es->p);
data_blk_offset++;
remsize-=TCP_SND_BUF;
}
tcp_output(tpcb);
}
tcp_server_flag&=~(1<<7);
}
|
但是我觉得逻辑有点奇怪,为什么要在poll里发送?
直接调用函数发送不行吗?
于是把这段程序在检测到KEY0按下那段里
但是好像在accept里已经申请了内存给arg,其他回调函数使用的es都是从arg里分配的
在检测按键那段获得不了arg。。。
可能我描述的有些混乱
简单点就是想问,想发一个大的数据流,不在poll里发送,应该如何修改。。。。
|
|