lwip 如何建立多个连接
我使用的lpc1788+ucos+lwip现在使用官方提供的http服务器和tcp连接,单独使用的时候都可以达到目的,但是我现在想要同时使用这两个连接,做类似路由器的功能...
我使用的lpc1788+ucos+lwip 现在使用官方提供的http服务器和tcp连接,单独使用的时候都可以达到目的,但是我现在想要同时使用这两个连接,做类似路由器的功能,http用来设置网络参数,tcp用来做数据传送。写了两个任务,不同的优先级来完成这个功能,可是当这两个任务建立后,能够ping的通,但是http和tcp的功能都无法使用,请前辈给点指点。
展开
3个回答
展开全部
原始版本的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);
}
/*线程空间池*/
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);
}
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询