2010-06-04 29 views
0

我有一個基於選擇的服務器。套接字處於阻塞模式,但對於select()函數,我使用250 ms。時間到。Winsock Select()函數給出0xC00000FD異常

基本上我的服務器只接受一個客戶端並將數據發送到該客戶端。 如果我只是將數據從服務器發送到客戶端,它可以正常工作數週。

但我意識到,如果客戶端在select()行3-4小時後向服務器發送數據,它會發生堆棧溢出異常(0xC00000FD)。 我紅了幾十倍Select()的MSDN頁面,但是沒有提到與此有關。 我真的被卡住了。任何幫助將不勝感激。

順便說一下,我發現在網上,例如;在接受客戶端連接後

http://tangentsoft.net/wskfaq/examples/basics/select-server.cpp

在這裏,他將其設置爲非阻塞模式。 它被評論說,

// Mark the socket as non-blocking, for safety. 

上面的「安全」是什麼意思? 那麼你認爲這是我的問題嗎?因爲在我的實現中,連接的模塊處於阻塞模式?

在此先感謝

回答

1

例外意味着您的代碼中存在一個錯誤。由於你得到了堆棧溢出,你的代碼中可能會有一個遞歸循環運行時間過長,每次調用都會佔用堆棧空間,直到沒有剩餘堆棧空間。在正常情況下,select()會在失敗時返回一個錯誤代碼,所以你必須把程序的內存搞亂纔會出現異常。

+0

嗨雷米, 感謝您的回覆。但問題是有一個循環用select()調用進行輪詢。所以沒有遞歸函數調用。如果客戶端不發送任何數據,則完全沒有問題。但是,如果它發送數據,4-5小時後它會在select()函數中發生緩衝區溢出。如果有幫助,我可以發佈僞代碼? – AFgone 2010-06-08 09:54:51

+0

然後你不太可能得到堆棧溢出。緩衝區溢出是完全不同的東西。不過,這確實聽起來像是你錯誤地管理你的代碼。所以是的,請顯示一些實際的代碼。 – 2010-06-08 22:08:13