LWIP移植成功了

2020-01-01 17:34发布

成功移植lwip1.3.1 1.3.2 1.4.1,裸机能跑tcp客户端和服务器。
开心之余,又有些问题需要请教了,lwip里面如何处理断线重连的问题?

下面是我实验的现象:
我在裸机上使用lwip,tcp做了服务器和客户端,在连接后把网线拔掉,tcp_poll函数还是会被执行的,这时候把网线插上(还没出现abort错误),需要重新连接(端口没变,原连接已经没反应了),连接后上一次连接的pcb仍然存在,这时候会发现轮询时候有两个pcb连接在运行。等了好几分钟后(关闭了保活设置)第一个pcb连接出现连接错误,自动断开。。。
这两个pcb占用同一个端口不会产生冲突吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
100条回答
xhyzjiji
2020-01-05 13:51
创建一个tcp服务器
1.初始化你的服务器
void tcp_server_init(void)
{
        struct tcp_pcb *pcb;

        //printf("tcp server init ");
       
        pcb = tcp_new();  //分配一个struct tcp_pcb大小的内存,如果分配不成功,则尝试清除tcp记录列表中处于等待状态的tcp连接,再重新分配内存。分配成功后,对此tcp记录一些信息初始化(如设置优先级,默认为普通优先级)

        //print_server_pcb_state(pcb);  //显示返回tcp的状态,用于调试用的
          /*
               void print_server_pcb_state(struct tcp_pcb *pcb){
        printf("server state:%s ", tcp_debug_state_str(pcb->state));
               }
               */
        tcp_bind(pcb, IP_ADDR_ANY, 1200);  //设置服务器端口号为1200,注意这里最好不要设置一些常被占用的端口号,如8080之类的
        //tcp_bind(pcb, &enc28j60.ip_addr, 2200);
        pcb = tcp_listen(pcb);  //将此tcp连接移至侦听tcp队列中去
        print_server_pcb_state(pcb);  //再次打印tcp连接状态
                                           
               tcp_accept(pcb, tcp_server_accept);         //初始化pcb->accept,当服务器接收到客户端链接申请,则自动调用服务器连接tcp中的pcb->accept指向的函数
}

一周热门 更多>