看板Programming
标 题Re: 请问一个Winsock问题
发信站SEEDNet News Service (Thu Jul 13 22:27:23 2006)
转信站ptt!ctu-reader!ctu-gate!news.nctu!news.ntu!feeder.seed.net.tw!news.see
"Martini,放两颗橄榄" <
[email protected]> 撰写於邮件新闻:
[email protected]...
>※ 引述《
[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的工作管理员吗?
> 请问要如何使用它来看程式跑的情况呢?
> 感谢您的回答
是的,就是windows的工作管理员,
你在主选单选择 检视->选择栏位, 把执行绪打勾,
然後跑跑程式看看,先确定每个执行绪都正常关闭
也就是执行绪数目没有增加,再来找其他原因.