成功移植lwip1.3.1 1.3.2 1.4.1,裸机能跑tcp客户端和服务器。
开心之余,又有些问题需要请教了,lwip里面如何处理断线重连的问题?
下面是我实验的现象:
我在裸机上使用lwip,tcp做了服务器和客户端,在连接后把网线拔掉,tcp_poll函数还是会被执行的,这时候把网线插上(还没出现abort错误),需要重新连接(端口没变,原连接已经没反应了),连接后上一次连接的pcb仍然存在,这时候会发现轮询时候有两个pcb连接在运行。等了好几分钟后(关闭了保活设置)第一个pcb连接出现连接错误,自动断开。。。
这两个pcb占用同一个端口不会产生冲突吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
static err_t
low_level_output(struct netif *netif, struct pbuf *p) //
{
struct ethernetif *ethernetif = netif->state;
struct pbuf *q;
uint16_t offset = 0;
initiate transfer(); //初始化传输设备,无需要则注释掉
#if ETH_PAD_SIZE
pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
#endif
for(q = p; q != NULL; q = q->next) {
/* Send the data from the pbuf to the interface, one pbuf at a
time. The size of the data in each pbuf is kept in the ->len
variable. */
send data from(q->payload, q->len); //对比input,output也是如此,不过是个反过程,将lwip发送队列的内存池数据塞进我们网卡的发送缓存区中,准备发送
memcpy((uint8_t*)ð_tx_buf[offset], (uint8_t*)q->payload, q->len);
offset += q->len; //记录复制数据的位置
}
signal that packet should be sent(); //提示我们需要发送数据了,注释掉
enc28j60PacketSend(offset, eth_tx_buf); //调用底层驱动发送数据咯
#if ETH_PAD_SIZE
pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
#endif
LINK_STATS_INC(link.xmit); //记录发送数据个数,不记录就注释可以了
return ERR_OK;
}
至此,底层驱动已经于lwip关联起来,lwip可以自由调用底层驱动了。这告诉我们,底层驱动只需要两个函数,一个是接收数据包存储起来,并且可以返回数据包大小的函数;一个是发送指定缓冲区的数据,对于其他的网络芯片也是如此。
对于lwip的内存池和一些重要的数据结构,可能在后面的应用提及会比较好吧?
一周热门 更多>