能用udp盡量用udp,能不用tcp就不用。tcp要維護連線,錯包重發,確認,錯序調整等。
消耗比較大。udp只需要再乙個埠上進行io操作,而tcp則需要再不同的埠上進行io操作。
假設說用tcp:
案例1:
建立乙個同時維持1000個鏈結的伺服器。
先說缺點
1。阻塞模型:
1000個鏈結需要建立2000個執行緒去receive和send資料。開銷相當大。
2。select模型:
乙個執行緒搞定所有的事情。不過1000個執行緒,建立fd_set集的記憶體開銷不說,最重要的是,select函式本身可能就比較慢,因為要訪問所有的socket.其次,select即使返回了,對於1000個socket來說,就要有3000次判斷!而此時有可能只有乙個socket的某乙個fd事件發生!
3。wsaaynselect模型:
這個wsaaynselect是非同步的,最大的優勢是在開銷不是很大的情況下可以同時處理多個鏈結。比select模型節省3000*4位元組的記憶體開銷。但是如果同時維護1000個鏈結,其訊息佇列的處理速度有可能成為其效能瓶頸。
4。wsaeventselect模型:
這個模型不進訊息佇列,處理速度比wsaasnselect好。也能同時維護很多鏈結。但是最多也就是waifor只能64個,如果要多個的話,需要建立額外的執行緒。如果1000個鏈結,那麼waifor將至少建立15個執行緒。這將是很大的一筆開銷。同時由於event與socket進行了繫結,1000個鏈結必須要求有1000個event。
但是也是64個的缺點。
因為它和這4種模型不同的是,使用重疊模型的應用程式通知緩衝區收發系統直接使用資料,也就是說,如果應用程式投遞了乙個10kb大小的緩衝區來接收資料,且資料已經到達套接字,則該資料將直接被拷貝到投遞的緩衝區。
而這4種模型種,資料到達並拷貝到單套接字接收緩衝區中,此時應用程式會被告知可以讀入的容量。當應用程式呼叫接收函式之後,資料才從單套接字緩衝區拷貝到應用程式的緩衝區,差別就體現出來了。效率之高是驚人的。
6。完成埠模型:
這個模型在處理高併發的應用程式時效果特別明顯。通過限制工作執行緒的數目來控制其效率。不然工作執行緒在1000個以上,執行緒的切換代價是很高的。
下面討論一下udp在以上6個模型中的情況:
1。阻塞模型。需要建立乙個send,乙個receive執行緒。然後再建立工作執行緒若干。
2。select模型。只需要建立乙個執行緒。比較適合做udp伺服器。不過,如果伺服器是多核的,這個就必須被淘汰。
3。wsaeventselect跟重疊模型一樣。優先用重疊模型。需要建立乙個主線程,外加若干工作執行緒。
4。完成埠。需要建立工作執行緒池。和乙個主線程。
綜上所述。
就目前情況,udp伺服器最好用重疊模型,因為不需要維護連線,所以幾個執行緒可以處理所有的鏈結。所以沒必要開銷很大地去建立完成埠,從而降低效率。
綜合以上考慮:連線數目少,或者udp就用重疊模型。
連線數目多,而且是tcp就用完成埠模型。
如果是windows客戶端開發用wsaaysnselect模型。
連線數目為一的情況下,考慮一下阻塞模型和select模型。不過效能很差!
完畢。
C socket程式設計select模型
在做socket程式設計時,當要處理乙個server對應多個client,這種可以每個客戶端用乙個執行緒來處理,但是客戶端太多,程式的效能會降低。windows提供了select模型,很好的處理了一對多的模型。select的申明如下 int wsaapi select in int nfds,0,無...
C SOCKET通訊模型(一)select
為了 簡潔,socket上那些函式的返回錯誤值我就不再捕獲了,windows平台 server.cpp define fd setsize 2048 normal.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include i...
C SOCKET通訊模型(四)IOCP
相比ioevent,iocp沒有事件監聽,而是採用執行緒池管理 其實就是對使用者建立的執行緒的乙個分配管理機制,本身並不會建立多餘額外的執行緒 佇列的形式,這個系統佇列也就是所謂的完成埠,用於核心與應用層的互動。iocp沒有監聽事件數量的限制,沒有事件列表為空需要等待的問題,雖然ioevent沒有i...