Xilinx代码分析:start_application函数
本文将对以下代码进行详细的解析和解释:
int start_application()
{
struct tcp_pcb *pcb;
err_t err;
unsigned port = 7;
/* create new TCP PCB structure */
pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
if (!pcb) {
xil_printf("Error creating PCB. Out of Memory\n\r");
return -1;
}
/* bind to specified @port */
err = tcp_bind(pcb, IP_ANY_TYPE, port);
if (err != ERR_OK) {
xil_printf("Unable to bind to port %d: err = %d\n\r", port, err);
return -2;
}
/* we do not need any arguments to callback functions */
tcp_arg(pcb, NULL);
/* listen for connections */
pcb = tcp_listen(pcb);
if (!pcb) {
xil_printf("Out of memory while tcp_listen\n\r");
return -3;
}
/* specify callback to use for incoming connections */
tcp_accept(pcb, accept_callback);
xil_printf("TCP echo server started @ port %d\n\r", port);
return 0;
}
1. 函数介绍
start_application
函数的主要作用是开启一个TCP回声服务器,该服务器将在指定的端口(在本例中为7)上监听连接,并将接收到的任何数据返回给发送者。
2. 代码详解
2.1 创建新的TCP PCB结构
pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
这行代码创建一个新的TCP协议控制块(PCB),用于处理TCP连接。这里指定的IP类型是IPADDR_TYPE_ANY
,表示该PCB可以处理任何类型的IP地址(IPv4或IPv6)。
2.2 绑定到指定端口
err = tcp_bind(pcb, IP_ANY_TYPE, port);
这行代码将新创建的TCP PCB绑定到指定的端口,以便它可以接收到发送到该端口的所有数据。
2.3 设置TCP参数
tcp_arg(pcb, NULL);
这行代码设置TCP PCB的参数。在这个例子中,我们没有为回调函数提供任何参数,所以这里的参数是NULL
。
2.4 监听连接
pcb = tcp_listen(pcb);
这行代码让TCP PCB开始监听连接。如果TCP PCB不能转换为监听状态(例如,因为内存不足),那么tcp_listen
函数将返回NULL。
2.5 设置接受连接的回调函数
tcp_accept(pcb, accept_callback);
这行代码设置了一个回调函数,该函数将在新的连接被接受时被调用。
3. 总结
start_application
函数是启动TCP回声服务器的关键步骤。理解这个函数的工作原理,可以帮助我们更好地理解如何使用lwIP库来创建TCP服务器。
4. 参考文献
- lwIP协议栈源码
2.《深入理解lwIP协议栈》 - lwIP Wiki ↗
以上就是对start_application
函数的分析,希望对你有所帮助。如果你有任何问题,欢迎在评论区提问,我会尽力回答。