LWIP如何建立多个TCP连接?

[复制链接]
 楼主| 加油站 发表于 2007-4-19 08:45 | 显示全部楼层 |阅读模式
我在uCOS+LWIP平台上做TCP传输实验,建立了三个通讯任务,一个做客户端,主动去连接,另外两个任务做服务器.接受TCP连接.目前只有一个主动连接(客户端任务)和一个被动连接(服务器端任务)可正常工作,无法再增加连接数,这是为什么?请熟悉LWIP的大侠指点一下.
eleven11 发表于 2007-4-20 10:49 | 显示全部楼层

原始版本的lwip忘光了,提供我修改的,希望有帮助

/*线程空间池*/<br />typedef&nbsp;struct&nbsp;tagNETTHREAD<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state;//状态<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prio;&nbsp;//任务prio<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_STK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadStk[NET_THREAD_STK_LEN];//堆栈空间<br />}NETTHREAD,&nbsp;*PNETTHREAD;<br /><br /><br />/*初始化线程空间*/<br />static&nbsp;BOOL&nbsp;ThreadSpaceInit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((NET_THREAD_MAX_NUM&nbsp;+&nbsp;8&nbsp;+&nbsp;1)&nbsp;&gt&nbsp;OS_MAX_TASKS){&nbsp;//线程任务最大数目超过OS_MAX_TASKS<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;NET_THREAD_MAX_NUM;&nbsp;i&nbsp;++){<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetThreads.state&nbsp;=&nbsp;THREAD_SPACE_STATE_FREE;&nbsp;//状态为free<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetThreads.prio&nbsp;&nbsp;=&nbsp;NET_RECV_TASK_PRIO&nbsp;-&nbsp;1&nbsp;-&nbsp;i;&nbsp;//任务prio分配为tcp主循环任务的上NET_THREAD_MAX_NUM个<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TRUE;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />/*每accept一个socket分配一个线程*/<br />int&nbsp;NetThreadCreate(void&nbsp;*&nbsp;s)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;NET_THREAD_MAX_NUM;&nbsp;i&nbsp;++){&nbsp;//搜索线程池,首先释放已经销毁的线程资源<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(NetThreads.state&nbsp;==&nbsp;THREAD_SPACE_STATE_DELING)//线程状态是否为del<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(OSTaskDel(NetThreads.prio)&nbsp;==&nbsp;OS_TASK_DEL_ERR){//若是,判断任务是否已经删除<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetThreads.state&nbsp;=&nbsp;THREAD_SPACE_STATE_FREE;//若任务已经删除,则释放线程资源<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;NET_THREAD_MAX_NUM;&nbsp;i&nbsp;++){//搜索线程池,看是否有可用的线程资源<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(NetThreads.state&nbsp;==&nbsp;THREAD_SPACE_STATE_FREE){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetThreads.state&nbsp;=&nbsp;THREAD_SPACE_STATE_USED;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*创建线程任务,server是scoket里面的任务服务函数,所以首先需要添加socket里面的域,并在建立服务期线程<br /><br />connect成功的时候给你赋值*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(OSTaskCreate(((PSOCKET)s)-&gtserver,&nbsp;s,&nbsp;&NetThreads.threadStk[NET_THREAD_STK_LEN&nbsp;-&nbsp;1],&nbsp;<br /><br />NetThreads.prio)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(int)&NetThreads;&nbsp;//返回线程id,必须在socket里面在添加一个域用来保存&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetThreads.state&nbsp;=&nbsp;THREAD_SPACE_STATE_FREE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ERROR;<br />}<br /><br />/*销毁一个线程*/<br />void&nbsp;NetThreadDel(void&nbsp;*&nbsp;s)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PNETTHREAD&nbsp;pt;//根据socket得到线程id(pt),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//线程空间的state要设置为del&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pt-&gtstate&nbsp;=&nbsp;THREAD_SPACE_STATE_DELING;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//在根据次id得到线程任务prio,删除任务&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskDel(pt-&gtprio);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}
high 发表于 2007-4-25 02:24 | 显示全部楼层

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

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

129

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

10

主题

129

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部