前言
最近在学习zynq中的lwip协议族,找不到很好的记笔记的地方,所以就用csdn记录一下自己的学习过程。现在对lwip不熟悉,只是把官方的lwip echo server例程跑了一下,能跑通就一点点的照着学了,笔记都是根据自己的理解写的,而且部分内容可能也只针对lwip echo server例程有效,笔记可以供有缘人参考,但不敢保证全对,有不对的地方也期待有高人指点一二。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/weixin_40356705/article/details/136824649
一、概述
- 原型
int start_application()
- 参数
无 - 作用
lwip应用函数,完成系统网路应用功能的初始化。在lwip echo server例程中这段代码是一个简单的TCP回声(echo)服务器应用程序的启动函数,用于在指定的端口上监听并响应传入的连接。
二、函数体
int start_application()
{
struct tcp_pcb *pcb;
err_t err;
unsigned port = 7;
//这里定义了三个变量:
//pcb:指向`tcp_pcb`结构的指针,该结构用于存储TCP连接的信息。
//err:用于存储`tcp_bind`函数的返回值,表示错误码。
//port:无符号整数,指定服务器应该监听的端口号,这里设置为7。
pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
//使用tcp_new_ip_type函数创建一个新的TCP PCB,并指定它可以绑定到任何IP地址类型。
if (!pcb) {
xil_printf("Error creating PCB. Out of Memory\n\r");
return -1;
}
//如果pcb为NULL,说明创建PCB时发生了错误(可能是内存不足)。然后,它使用xil_printf函数输出错误消息并返回-1。
err = tcp_bind(pcb, IP_ANY_TYPE, port);
//使用tcp_bind函数将PCB绑定到指定的端口。IP_ANY_TYPE表示PCB可以绑定到任何IP地址。
if (err != ERR_OK) {
xil_printf("Unable to bind to port %d: err = %d\n\r", port, err);
return -2;
}
//如果tcp_bind返回的不是ERR_OK,则输出错误消息并返回-2。
tcp_arg(pcb, NULL);
//使用tcp_arg函数设置当回调函数被调用时应该传递的参数。在这里,我们不需要传递任何参数,所以设置为NULL。
pcb = tcp_listen(pcb);
//使用tcp_listen函数使PCB开始监听传入的连接。
if (!pcb) {
xil_printf("Out of memory while tcp_listen\n\r");
return -3;
}
//如果tcp_listen返回NULL,则输出错误消息并返回-3。
tcp_accept(pcb, accept_callback);
//使用tcp_accept函数设置当新的连接被接受时应该调用的回调函数。在这里,回调函数是accept_callback。
xil_printf("TCP echo server started @ port %d\n\r", port);
//使用xil_printf函数输出一个消息,告知用户TCP回声服务器已经开始在指定的端口上监听。
return 0;
}
三、调用关系
被main函数调用,调用函数较多,分别调用了tcp_new_ip_type注册新的pcb(申请内存空间),调用tcp_bind绑定端口号·(绑定为7),调用tcp_arg函数绑定参数(此处没有绑定参数),调用tcp_listen使PCB开始监听传入的连接,调用了tcp_accept注册pcb的回调函数为accept_callback。