標籤:style blog color io 使用 ar 資料 div 代碼
只要接觸過c/c++網路編程人都可能會知道select io 模式,網路書籍都說 fd_set {int num; SOCKET arr[64]} 有所限制,因為數組的長度只有64,那麼超過64你就不能放,要麼你就是用多線程分別實用select.。一些書籍通過改定義宏 使數組的長度變長,但也不實用,不能動態變化,我總不能定一個非常的長的長度,畢竟是在棧上。 我就在想那麼select完全只能在用戶端使用,而且通訊端還不能超過64。那這不就是一個軟肋嗎??一直對這個有一個迷惑。。。。。 後來,自己看到了libevent的原始碼發現他也用的是select。。看別人說這個庫,輕輕鬆鬆處理上萬個通訊端,我就在想select不是有限制嗎??他是怎麼做到。。。。。。看了原始碼,我明白了。他只是用對上存放SOCKET的控制代碼。。我們看一下他的新定義結構體。 struct win_fd_set {u_int fd_count;SOCKET fd_array[1];}; 這個就是新定義結構體,跟原來稍微有點變化只是把64改為1,有些同學可能見多很多這樣的寫法,這種寫法我也在一些項目使用了。這種寫法可以fd_array動態變化。win_fd_set * Set = (win_fd_set*)malloc(sizeof(win_fd_set) + sizoef(SCOEKT) * 10);Set->fd_array 可以放11 個 SOCKET,因為我的記憶體大小足夠放11個SOCKET。請記住記憶體是沒有資料格式,只要足夠大小,隨便你怎麼放。資料格式只是方便我們管理和處理資料而已。這樣就解決64個大小限制。。我其實一直很好奇為什麼中國書籍都是一樣的,libevent已經出來好久了,但也沒有看到有人說這一點,可能是高手們都不屑。現在漸漸喜歡看開源的代碼,不喜歡看書籍了,喜歡在代碼中學習他們是怎麼組織一個好項目。有時候感慨:高手用c 寫著漂亮的c++代碼,而我等菜鳥卻用c++ 寫醜陋的c代碼。。
select()2