看板Programming
标 题Re: 请问一个Winsock问题
发信站无名小站 (Thu Jul 13 14:16:48 2006)
转信站ptt!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!wretch
※ 引述《[email protected] (DX)》之铭言:
> "Martini,放两颗橄榄" <[email protected]> 撰写於邮件新闻:[email protected]...
> > 我的程式是server-client架构,
> > server在每个client连线时,会再另外开一个socket和client传资料,
> > 并且开一个thread将这个socket传进thread中,
> > thread结束後确实将socket关闭.....
> > 但问题来了,我的socket拿到的descriptor值会越来越大...
> > winsock中的socket descriptor是无号整数,照理说应该只到65535吧,
> > 可是我的socke拿到的descriptor值却一直增加,
> > 很多已用过然後关闭的socket descriptor就不会再拿到了,但有的就会,
> > 整个程式跑下来一天,socket descriptor值已经到50几万了,
> > 不知道再这样run下去会不会有问题,
> > 想请问高手们是否知道这个原因呢,谢谢回答
> > PS:我是用VC++ 6.0 , MFC
> 你是用_beginthreadex产生新的thread,然後把socket id丢过去
> ,透过id去send or recv吗? 理论上你正常closesocket之後,socket
> id会被释放,我比较怀疑的是你如果是用_endthrreadex()来结束
> thread的话,没有同时释放那个thread handle(使用closehandle());
> 你可以开工做管理员并把相关的栏位打开看看跑的结果.
对阿,我的流程是主程式先开socket -> 产生新的thread -> 把socket id丢过去,
并且有把thread handle存在别的地方,
等thread正常结束 (return掉)之後再使用closehandle()来释放该handle,
若是在thread结束前,在thread内先closesocket,再让thread return掉,
则此socket id就再也没办法被拿来用,
若是在主程式等thread return掉後,再於主程式中closesocket,
则socket id就我观察的结果,是会被重复拿来用没错,
但用了几次以後(重复被使用4,5次)就不会再被拿来用,
然後如果再开socket就会再去拿更大的id...
请问您说的工作管理员是指windows的工作管理员吗?
请问要如何使用它来看程式跑的情况呢?
感谢您的回答
--
夫兵者不祥之器物或恶之故有道者不处君子居则贵左用兵则贵右兵者不祥之器非君子
之器不得已而用之恬淡为上胜而不美而美之者是乐杀人夫乐杀人者则不可得志於天下
矣吉事尚左凶事尚右偏将军居左上将军居右言以丧礼处之杀人之众以哀悲泣之战胜以
丧礼处之道常无名朴虽小天下莫能臣侯王若能守之万物将自宾天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦将知止知止可以不殆pc092018.ccl.itri.org.tw海
作者在
06/07/13 14:16:48 从
pc092018.ccl.itri.org.tw 修改这篇文章