select()2

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.