打印

LWIP如何建立多个TCP连接?

[复制链接]
8848|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
加油站|  楼主 | 2007-4-19 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在uCOS+LWIP平台上做TCP传输实验,建立了三个通讯任务,一个做客户端,主动去连接,另外两个任务做服务器.接受TCP连接.目前只有一个主动连接(客户端任务)和一个被动连接(服务器端任务)可正常工作,无法再增加连接数,这是为什么?请熟悉LWIP的大侠指点一下.

相关帖子

沙发
eleven11| | 2007-4-20 10:49 | 只看该作者

原始版本的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);     
}

使用特权

评论回复
板凳
high| | 2007-4-25 02:24 | 只看该作者

一般这玩意都有配置选项,去看看连接数有没有bei限制等等的.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

129

帖子

1

粉丝