c socket模型之我見

2021-08-05 19:39:30 字數 1562 閱讀 3502

能用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...