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);
}