成功移植lwip1.3.1 1.3.2 1.4.1,裸机能跑tcp客户端和服务器。
开心之余,又有些问题需要请教了,lwip里面如何处理断线重连的问题?
下面是我实验的现象:
我在裸机上使用lwip,tcp做了服务器和客户端,在连接后把网线拔掉,tcp_poll函数还是会被执行的,这时候把网线插上(还没出现abort错误),需要重新连接(端口没变,原连接已经没反应了),连接后上一次连接的pcb仍然存在,这时候会发现轮询时候有两个pcb连接在运行。等了好几分钟后(关闭了保活设置)第一个pcb连接出现连接错误,自动断开。。。
这两个pcb占用同一个端口不会产生冲突吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
如何让lwip动起来?
之前提到,可以使用lwip自带的内存管理机制,那么在使用前,就必须先对相关内存进行初始化,
void LwIP_Init(void)
{
struct ip_addr ipaddr;
struct ip_addr netmask;
struct ip_addr gw;
//uint8_t macaddress[6]={0,0,0,0,0,1};
//uint8_t macaddress[6]={0x3c,0x97,0x0e,0x34,0xeb,0x98}; //设置本地mac地址
/* Initializes the dynamic memory heap defined by MEM_SIZE.*/
mem_init(); //动态内存/内存堆的初始化函数,主要是告知动态内存/内存堆的起止地址,以及初始化空闲列表。摘自老衲五木的源码分析
/* Initializes the memory pools defined by MEMP_NUM_x.*/
memp_init(); //初始化内存池的函数,
#if LWIP_DHCP //如果开启DHCP,可以使用自动获取IP功能
ipaddr.addr = 0;
netmask.addr = 0;
gw.addr = 0;
#else //设置本地IP地址,掩码,网关,在不适用自动获取IP的时候,需要手动赋予网络接口ip,掩码,网关。
#if another
IP4_ADDR(&ipaddr, 192, 168, 1, 111); //IP4_ADDR函数:将ip地址组合成一个32位的数据,并记录在所指向的内存单元中
#else
IP4_ADDR(&ipaddr, 192, 168, 1, 112);
#endif
IP4_ADDR(&netmask, 255, 255, 255, 0);
IP4_ADDR(&gw, 192, 168, 1, 1);
#endif
//Set_MAC_Address(macaddress); //保存至全局变量
/* - netif_add(struct netif *netif, struct ip_addr *ipaddr,
struct ip_addr *netmask, struct ip_addr *gw,
void *state, err_t (* init)(struct netif *netif),
err_t (* input)(struct pbuf *p, struct netif *netif))
Adds your network interface to the netif_list. Allocate a struct
netif and pass a pointer to this structure as the first argument.
Give pointers to cleared ip_addr structures when using DHCP,
or fill them with sane numbers otherwise. The state pointer may be NULL.
The init function pointer must point to a initialization function for
your ethernet netif interface. The following code illustrates it's use.*/
netif_add(&enc28j60, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input); //对网络接口添加ip,掩码,网关信息,指定网络接口初始化和输入函数,这里的enc28j60是一个struct netif型的全局变量
/* Registers the default network interface.*/
netif_set_default(&enc28j60); //把enc28j60设置为默认网卡
#if LWIP_DHCP
/* Creates a new DHCP client for this interface on the first call.
Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at
the predefined regular intervals after starting the client.
You can peek in the netif->dhcp struct for the actual DHCP status.*/
dhcp_start(&enc28j60); //如果开启ip自动获取,则会产生一个udp的DHCP客户端,广播询问路由器,路由器给出回应并返回一个ip,客户端则继续广播,询问此ip是否被占用,若否则获取成功,并修改网络接口中的dhcp状态,具体请看后面的应用
#endif
/* When the netif is fully configured this function must be called.*/
netif_set_up(&enc28j60); //使能enc28j60接口
//printf("LwIP Init Succedd ");
}
一周热门 更多>