关于TCP server程序的一点问题

2019-07-21 00:53发布

对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里发送,应该如何修改。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
65993366
2019-07-21 08:04
回复【2楼】zuozhongkai:
---------------------------------
不在poll里发送,我把发送的语句直接放到检测到KEY0按下部分
senddata函数里的参数es该怎么初始化?
原来的程序里,es所占的内存先由accept分配,并且绑定到void* arg,
再进入poll,
struct tcp_server_struct *es;
es=(struct tcp_server_struct *)arg;

但是如果在主程序里直接发送,不知道arg的地址啊。。。

一周热门 更多>