微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TCP over lwIP 只返回一行,一般发送 8 条消息就崩溃

如何解决TCP over lwIP 只返回一行,一般发送 8 条消息就崩溃

我正在尝试使用 FreeRTOS 中提供的库在 MPC5748G 上实现命令行界面。我正在使用 lwIP 堆栈。我设法使用 UDP 运行 CLI,但是在使用 TCP 实现相同功能时遇到两个错误

  • TCP 连接在发送 8 个命令后停止工作。
  • 无论 pdFALSE 值如何,都只会通过 TCP 打印出一行。如果命令返回更多行,则只会打印出第一行。

使用 UDP 时没有出现这些错误(我编写的代码非常相似)。到目前为止,我尝试在单独的任务中分离“聆听”和“响应”功能,但并没有解决问题。

有没有人知道为什么在收到 8 个命令后任务会冻结?或者甚至如何打印出更多的行? 根据我的理解,tcp 连接应该仍然处于活动状态 - 有一个单独的函数可以关闭连接而不删除它。我没有在这里使用它,所以 - 据我所知 - 只要它启动,我就应该能够 write() 到连接。

我使用的代码

void vTCPCommandConsoleTask(void* pvParamaters){

struct netconn *pxNewConnection,*tcpconn;
struct netbuf *buf,*pxRxBuffer,*buf_send;
err_t connection_err,send_err,bind_err,listen_err,accept_err,recv_err;
ip_addr_t board_addr;
unsigned int payload_len;
char *data,*payload_data;
BaseType_t xMoreDataToFollow;
static signed char cOutputString[ configCOMMAND_INT_MAX_OUTPUT_SIZE ],cLocalBuffer[configCOMMAND_INT_MAX_OUTPUT_SIZE ]; 

/* create a new connection */
tcpconn = netconn_new(NETCONN_TCP);

/* bind the connection to a local IP */
IP4_ADDR((&board_addr.u_addr.ip4),netif_cfg[0]->ip_addr[0],netif_cfg[0]->ip_addr[1],netif_cfg[0]->ip_addr[2],netif_cfg[0]->ip_addr[3]);
bind_err = netconn_bind(tcpconn,&board_addr,SRC_PORT_NUM );

/* start listening and accept */
if (bind_err== ERR_OK) {
    listen_err = netconn_listen(tcpconn);
    for( ;; ){
          accept_err = netconn_accept(tcpconn,&pxNewConnection);
              if(accept_err == ERR_OK){
                /*recieve the packet */
                recv_err = netconn_recv(pxNewConnection,&pxRxBuffer);
                if ( recv_err == ERR_OK ){
                    /* Get the payload and length */
                    payload_len = pxRxBuffer->p->len;
                    payload_data = pxRxBuffer->p->payload;

                    /* copy the recieved message into the command string */
                    signed char cInputString[payload_len];
                    strncpy(cInputString,payload_data,payload_len);

                    /* create new buffers and send them for each line of the output */
                    do{
                        /*Pass the string to FreeRTOS+CLI. */
                        xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString,cOutputString,configCOMMAND_INT_MAX_OUTPUT_SIZE );

                        /*create a buffer to send the data and fill it with output */
                        buf_send = netbuf_new();
                        data = netbuf_alloc(buf_send,sizeof(cOutputString));
                        memcpy(data,sizeof(cOutputString));

                        /* Send the output generated by the command's implementation. */
                        netconn_write( pxNewConnection,data,(u16_t) configCOMMAND_INT_MAX_OUTPUT_SIZE,NETCONN_copY );

                        /* Free the buffer */
                        netbuf_delete(buf_send);
                    } while( xMoreDataToFollow != pdFALSE ); /* keep sending until the command does not generate any more output. */

            } //recv_err == ERR_OK

          } //accept_err

    } //while(1)

} //bind_err

解决方法

  1. 崩溃。

问题是内存溢出——每个新的 nectonn_recv() 都会分配一个新的缓冲区。问题已通过在接收循环末尾添加 netbuf_delete(pxRxBuffer); 解决。这样程序就可以确保内存会被再次使用。

  1. 输出中只有一行。

这个问题已经通过在循环中发送一个空字符串来解决。添加 char test_data[1] = " "; netconn_write(pxNewConnection,test_data,1,NETCONN_COPY); 就在退出命令执行循环之前,将所有输出字符串打印出来。我相信这个问题出在应用程序的客户端。

  1. 更多错误。

上面的代码还有一个错误——netconn_accept() 每次调用都会调用一个新的连接。因此,另一个内存溢出可能是可能的,并且需要在接受循环结束时调用 netconn_close(pxNewConnection); netconn_delete(pxNewConnection); 以释放内存。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。