Re: 請問一個Winsock問題
"Martini,放兩顆橄欖" <Brad.bbs@bbs.wretch.cc> 撰寫於郵件新聞:4P7UbE$hK7@bbs.wretch.cc...
>※ 引述《fu@ms56.url.com.tw (DX)》之銘言:
>> "Martini,放兩顆橄欖" <Brad.bbs@bbs.wretch.cc> 撰寫於郵件新聞:4P7MbV$evy@bbs.wretch.cc...
>> > 我的程式是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的工作管理員,
你在主選單選擇 檢視->選擇欄位, 把執行緒打勾,
然後跑跑程式看看,先確定每個執行緒都正常關閉
也就是執行緒數目沒有增加,再來找其他原因.
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章