您好!
我正在使用 lwip 库创建一个从以太网接收 TCP 数据包的程序。 我的代码基于回波示例(nortos)。 该函数用于接收来自 TCP 的数据、并通过 UART 串行发送数据、反之亦然。 我成功地使用了回显示例并对其进行了微调、以接收数据包、处理数据包并通过 UART 发送数据、但是我在使用 TCP 写入函数将数据发送到同一 TCP 端口时遇到了问题。 将一串数据发送到同一 TCP 端口的最简单方法是什么? 我所做的唯一调整是对 ECHO_recv 函数进行的、在该函数中、我接收传入的数据包、对其进行处理、然后清除缓冲区。
ERR_t
ECHO_recv (void *arg、struct tcp_pcb、struct pbuf *p、err_t err)
{
struct echo_state * es;
ERR_t RET_ERR;
LWIP_assert ("arg!= NULL"、arg!= NULL);
ES =(struct echo_state *) arg;
如果(p = NULL)
{
/*远程主机已关闭连接*/
ES->state = ES_Closing;
if (es->p ==空)
{
//我们已完成发送,关闭它*/
echo _close (tpcb、es);
}
其他
{
/*我们尚未完成*/
tcp_sent (tpcb、echo_sent);
ECHO_SEND (tpcb、es);
}
RET_ERR = ERR_OK;
}
否则、如果(err!= ERR_OK)
{
/*由于未知原因进行清理*/
if (p!= NULL)
{
ES->p = NULL;
pbuf_free (p);
}
RET_ERR =错误;
}
否则,如果(es->state == ES_Accepted)
{
/* p->payload 中的第一个数据块*/
ES->state = ES_Received;
字符串1[10];
memcpy (string1、p->payload、p->len);
int i = 0;
for (i = 0;i <= 10;i++){
Coordinator.modemManager.buffer.push (string1[i]);
}
tcp_recved (tpcb、p->t_t_len);
ES->p = NULL;
pbuf_free (p);
RET_ERR = ERR_OK;
/*存储对传入 pbuf (chain)的引用*/
// es->p = p;
/*安装发送完成通知*/
// tcp_sent (tpcb、echo_sent);
// echo_send (tpcb、es);
// ret_err = ERR_OK;
}
否则(es->state == ES_received)
{
/*阅读更多数据*/
if (es->p ==空)
{
ES->p = p;
// tcp_sent (tpcb、echo_sent);
// echo_send (tpcb、es);
字符串2[10];
memcpy (string2、p->payload、p->len);
int i = 0;
for (i = 0;i <= 10;i++){
Coordinator.modemManager.buffer.push (string2[i]);
}
tcp_recved (tpcb、p->t_t_len);
ES->p = NULL;
pbuf_free (p);
RET_ERR = ERR_OK;
}
其他
{
struct pbuf *ptr;
/*将 pbufs 链接到我们先前所述内容的末尾*/
ptr = es->p;
pbuf_chain (ptr、p);
}
RET_ERR = ERR_OK;
}
否则,如果(es->state == ES_Closing)
{
/*奇数情况、遥控侧关闭两次、垃圾数据*/
tcp_recved (tpcb、p->t_t_len);
ES->p = NULL;
pbuf_free (p);
RET_ERR = ERR_OK;
}
其他
{
/*未知 es->state、trash data */
tcp_recved (tpcb、p->t_t_len);
ES->p = NULL;
pbuf_free (p);
RET_ERR = ERR_OK;
}
返回 RET_ERR;
}