lwIP(V1.0.0) RAW API函数源码分析4----tcp_accept()函数
时间: 2024-03-15 17:43:54 浏览: 147
好的,关于lwIP(V1.0.0) RAW API函数源码分析系列的第四篇,我们来看一下tcp_accept()函数。
在lwIP中,tcp_accept()函数的作用是接受一个连接请求并创建新的TCP连接。下面是tcp_accept()函数的代码实现:
```c
struct tcp_pcb *
tcp_accept(struct tcp_pcb *pcb, err_t *err)
{
struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen*)pcb;
struct tcp_pcb *npcb;
LWIP_ASSERT("tcp_accept: invalid pcb", lpcb != NULL);
LWIP_ASSERT("tcp_accept: invalid pcb state", lpcb->state == LISTEN);
/* Check if there is a connection request */
if (lpcb->accept == NULL) {
*err = ERR_VAL;
return NULL;
}
/* Set pcb->accept to NULL before calling tcp_listen() again as accept is
only valid for one iteration! */
npcb = lpcb->accept;
lpcb->accept = NULL;
/* Call the accept callback function */
if (lpcb->accept_cb) {
struct tcp_pcb *ret;
ret = lpcb->accept_cb(lpcb->callback_arg, npcb, ERR_OK);
if (ret) {
npcb = ret;
}
}
/* Set state of the new PCB */
npcb->state = SYN_RCVD;
npcb->rcv_nxt = npcb->rcv_isn = lpcb->rcv_nxt;
npcb->snd_wl1 = lpcb->snd_wl1;
npcb->snd_wl2 = lpcb->snd_wl2;
npcb->callback_arg = lpcb->callback_arg;
/* Insert the new PCB into the list of active PCBs */
pcb_active_insert(npcb);
/* We now need to call tcp_listen() to make the PCB active */
tcp_listen(npcb);
return npcb;
}
```
tcp_accept()函数的参数pcb是一个监听pcb,它的类型是tcp_pcb_listen。而返回值则是一个新的已连接pcb,它的类型是tcp_pcb。
在函数开头,首先进行了一些参数的检查,如果出现异常,就会返回NULL并设置错误号err。
接下来,tcp_accept()会检查是否有连接请求。如果没有,也会返回NULL并设置错误号err。
如果有连接请求,tcp_accept()会将pcb->accept设置为NULL,并将连接请求保存到npcb中。然后,它会调用回调函数lpcb->accept_cb,如果有需要的话。如果回调函数返回了一个新的pcb,tcp_accept()会将npcb设置为新的pcb。
在接下来的操作中,tcp_accept()会设置npcb的状态为SYN_RCVD,并将一些信息从监听pcb复制到npcb中。最后,tcp_accept()会将npcb插入到活动pcb列表中,并调用tcp_listen()函数使npcb变为活动状态。
这就是tcp_accept()函数的主要实现过程。它的作用是非常重要的,因为它允许我们接受新的TCP连接请求并创建新的TCP连接。
阅读全文