LWIP如何建立多个TCP连接

发布网友 发布时间:2022-04-20 06:28

我来回答

1个回答

热心网友 时间:2023-08-04 08:05

原始版本的lwip忘光了,提供我修改的,希望有帮助
/*线程空间池*/
typedef struct tagNETTHREAD
{
BOOL state;//状态
int prio; //任务prio
OS_STK threadStk[NET_THREAD_STK_LEN];//堆栈空间
}NETTHREAD, *PNETTHREAD;

/*初始化线程空间*/
static BOOL ThreadSpaceInit(void)
{
int i;

if ((NET_THREAD_MAX_NUM + 8 + 1) > OS_MAX_TASKS){ //线程任务最大数目超过OS_MAX_TASKS

return FALSE;
}

for (i = 0; i < NET_THREAD_MAX_NUM; i ++){

NetThreads.state = THREAD_SPACE_STATE_FREE; //状态为free
NetThreads.prio = NET_RECV_TASK_PRIO - 1 - i; //任务prio分配为tcp主循环任务的上NET_THREAD_MAX_NUM个
}

return TRUE;
}

/*每accept一个socket分配一个线程*/
int NetThreadCreate(void * s)
{
int i;

for (i = 0; i < NET_THREAD_MAX_NUM; i ++){ //搜索线程池,首先释放已经销毁的线程资源

if (NetThreads.state == THREAD_SPACE_STATE_DELING)//线程状态是否为del
if (OSTaskDel(NetThreads.prio) == OS_TASK_DEL_ERR){//若是,判断任务是否已经删除

NetThreads.state = THREAD_SPACE_STATE_FREE;//若任务已经删除,则释放线程资源
}
}

for (i = 0; i < NET_THREAD_MAX_NUM; i ++){//搜索线程池,看是否有可用的线程资源

OS_ENTER_CRITICAL();

if (NetThreads.state == THREAD_SPACE_STATE_FREE){

NetThreads.state = THREAD_SPACE_STATE_USED;

OS_EXIT_CRITICAL();

/*创建线程任务,server是scoket里面的任务服务函数,所以首先需要添加socket里面的域,并在建立服务期线程

connect成功的时候给你赋值*/
if (OSTaskCreate(((PSOCKET)s)->server, s, &NetThreads.threadStk[NET_THREAD_STK_LEN - 1],

NetThreads.prio)){

return (int)&NetThreads; //返回线程id,必须在socket里面在添加一个域用来保存
}

NetThreads.state = THREAD_SPACE_STATE_FREE;

}else{

OS_EXIT_CRITICAL();
}
}

return ERROR;
}

/*销毁一个线程*/
void NetThreadDel(void * s)
{
PNETTHREAD pt;//根据socket得到线程id(pt),

//线程空间的state要设置为del

pt->state = THREAD_SPACE_STATE_DELING;
//在根据次id得到线程任务prio,删除任务

OSTaskDel(pt->prio);
}
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com