登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

LWIP如何建立多个TCP连接?

作者:加油站 栏目:ARM技术
LWIP如何建立多个TCP连接?
我在uCOS+LWIP平台上做TCP传输实验,建立了三个通讯任务,一个做客户端,主动去连接,另外两个任务做服务器.接受TCP连接.目前只有一个主动连接(客户端任务)和一个被动连接(服务器端任务)可正常工作,无法再增加连接数,这是为什么?请熟悉LWIP的大侠指点一下.

2楼: >>参与讨论
eleven11
原始版本的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[i].state = THREAD_SPACE_STATE_FREE; //状态为free
        NetThreads[i].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[i].state == THREAD_SPACE_STATE_DELING)//线程状态是否为del
        if (OSTaskDel(NetThreads[i].prio) == OS_TASK_DEL_ERR){//若是,判断任务是否已经删除
        
            NetThreads[i].state = THREAD_SPACE_STATE_FREE;//若任务已经删除,则释放线程资源
        }
    }    

    for (i = 0; i < NET_THREAD_MAX_NUM; i ++){//搜索线程池,看是否有可用的线程资源
    
        OS_ENTER_CRITICAL();
    
        if (NetThreads[i].state == THREAD_SPACE_STATE_FREE){
        
            NetThreads[i].state = THREAD_SPACE_STATE_USED;
            
            OS_EXIT_CRITICAL();
            
            /*创建线程任务,server是scoket里面的任务服务函数,所以首先需要添加SOCKET里面的域,并在建立服务期线程

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

NetThreads[i].prio)){
            
                return (int)&NetThreads[i]; //返回线程id,必须在SOCKET里面在添加一个域用来保存    
            }
            
            NetThreads[i].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);     
}

* - 本贴最后修改时间:2007-4-20 10:52:41 修改者:eleven11

3楼: >>参与讨论
high
一般这玩意都有配置选项,去看看连接数有没有bei限制等等的...
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
使用SlickEdit编写、编译ARM/KeilC代码(三)
使用SlickEdit编写、编译ARM/KeilC代码(二)
由ADS1.2中memcpy()想到的
[原创]2007年电子竞赛群
ARM 开发软件及实用工具介绍及下载
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号