在lwip-x.x.x/src/core/tcp.h中定义:
#definetcp_listen(pcb)tcp_listen_with_backlog(pcb,TCP_DEFAULT_LISTEN_BACKLOG)
所以, tcp_listen(pcb)和tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)是一回事. TCP_DEFAULT_LISTEN_BACKLOG在opt.h中定义,默认值为0xFF,指明最大允许的可等待TCP监听链接个数.
位于:位于:lwip-x.x.x/src/core/tcp.c
原型: struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
功能:使指定的连接开始进入监听状态
函数源码:
/**
* Set the state of the connection to be LISTEN, which means that it
* is able to accept incoming connections. The protocol control block
* is reallocated in order to consume less memory. Setting the
* connection to LISTEN is an irreversible process.
*设置连接进入LISTEN状态,这意味着这个连接能够接受传入的连接,为了消耗更少的内存,
协议控制块会被重新分配.设置连接进入LISTEN状态是一个不可逆转的过程
* @param pcb the original tcp_pcb
* @param backlog the incoming connections queue limit传入连接的队列限制
* @return tcp_pcb used for listening, consumes less memory.
*
* @note The original tcp_pcb is freed(原始的tcp_pcb会被释放). This function therefore has to be
* called like this:
* tpcb = tcp_listen(tpcb);
*/
struct tcp_pcb *
tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
{
struct tcp_pcb_listen *lpcb;
LWIP_UNUSED_ARG(backlog); // #define LWIP_UNUSED_ARG(x) (void)x
LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL);
/* already listening? 是否应经处于监听?*/
if (pcb->state == LISTEN) {
return pcb;
}
lpcb = memp_malloc(MEMP_TCP_PCB_LISTEN);//申请一块内存
if (lpcb == NULL) {
return NULL;
}
lpcb->callback_arg = pcb->callback_arg;
lpcb->local_port = pcb->local_port;
lpcb->state = LISTEN; //置监听标志位
lpcb->so_options = pcb->so_options;
lpcb->so_options |= SOF_ACCEPTCONN;
lpcb->ttl = pcb->ttl;
lpcb->tos = pcb->tos;
ip_addr_set(&lpcb->local_ip, &pcb->local_ip);
TCP_RMV(&tcp_bound_pcbs, pcb);
memp_free(MEMP_TCP_PCB, pcb); //释放原来的(原始的) PCB
#if LWIP_CALLBACK_API
lpcb->accept = tcp_accept_null; //默认回调函数
#endif /* LWIP_CALLBACK_API */
#if TCP_LISTEN_BACKLOG
lpcb->accepts_pending = 0;
lpcb->backlog = (backlog ? backlog : 1);
#endif /* TCP_LISTEN_BACKLOG */
TCP_REG(&tcp_listen_pcbs.listen_pcbs, lpcb); //将连接放入已监听队列
return (struct tcp_pcb *)lpcb;
}
分析:这个函数从原理上看也比较简单,首先是做一些必要的检查,判断原始pcb是否已经处于连接状态,如果没有则申请一块tcp_pcb类型的内存,将原始的必要的pcb内容复制到新的pcb中,设置新的pcb状态为LISTEN,释放原始的pcb,并将新pcb连接放入已监听队列.
分享到:
相关推荐
stm32f107VCT 实现LWIP_TCP client程序,利用网络调试助手可以接收客户端发送的数据。
lwip 协议 API,快速入手,可作为检索,LwIP的RAW API接口及编程指南。...首先,介绍了RAW API的特点及优缺点,然后逐个介绍了LwIP提供的所有的RAW API函数,最后通过实例的形式介绍了这些API函数具体编程的方法。
LWIP中tcp_write函数的理解 对lwip协议的一些分析
lwip移植加tcpip客户端功能代码,在ucos系统基础上移植lwip,并使用raw接口进行客户端服务编写
ZLG_LwIP的RAW_API接口及编程指南 ZLG_LwIP的RAW_API接口及编程指南 ZLG_LwIP的RAW_API接口及编程指南 ZLG_LwIP的RAW_API接口及编程指南
stm32f107VCT 实现服务端socket 编程server端程序部分,网络调试助手可以进行数据检验。
STM32F4x7_ETH_LwIP_V1.0.0
lm3sapp_ethernet_lwip_rawapi.7z
本实验采用LWIP的RAW编程方法实现TCP Server功能,默认开启DHCP自动获取IP地址。电脑端打开网络调试助手,网络调试助手做客户端,所以选择TCP Client协议。开发板做TCP服务器。
freertos ,stm32f107,sd卡
LWIP源码及移植说明LWIP源码及移植说明LWIP源码及移植说明
LwIP在STM32 107裸机LwIP,无操作系统 包括DHCP client,Telnet, TFTP server, web server 的实现
LwIP with STM32 src code(F407)
TCP/IP 协议栈LwIP的设计与实现,翻译 焦海波,很好的资料。
LwIP的RAW_API接口及编程指南.pdf
TCP服务端,UDP服务端,把接收到TCP客户端的信号后转发到UDP客户端
经过修改lwip2.0的bug后的协议栈, 我现在正在使用的,希望对大家有用。
嵌入式设备lwip移植中需要用到的相关函数说明,很详细。
详细介绍了LWIP中tcp/udp部分的raw函数,并有通讯实例。