Re: 請問一個Winsock問題

看板Programming作者時間18年前 (2006/07/13 14:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
"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的工作管理員, 你在主選單選擇 檢視->選擇欄位, 把執行緒打勾, 然後跑跑程式看看,先確定每個執行緒都正常關閉 也就是執行緒數目沒有增加,再來找其他原因.
文章代碼(AID): #14jUZb00 (Programming)
文章代碼(AID): #14jUZb00 (Programming)