如何解决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
解决方法
- 崩溃。
问题是内存溢出——每个新的 nectonn_recv() 都会分配一个新的缓冲区。问题已通过在接收循环末尾添加 netbuf_delete(pxRxBuffer);
解决。这样程序就可以确保内存会被再次使用。
- 输出中只有一行。
这个问题已经通过在循环中发送一个空字符串来解决。添加
char test_data[1] = " "; netconn_write(pxNewConnection,test_data,1,NETCONN_COPY);
就在退出命令执行循环之前,将所有输出字符串打印出来。我相信这个问题出在应用程序的客户端。
- 更多错误。
上面的代码还有一个错误——netconn_accept() 每次调用都会调用一个新的连接。因此,另一个内存溢出可能是可能的,并且需要在接受循环结束时调用 netconn_close(pxNewConnection); netconn_delete(pxNewConnection);
以释放内存。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。