關於socket通訊,如何才能高效?

2022-07-08 04:18:08 字數 1282 閱讀 7126

他之前是做客戶端的,無奈人力資源緊張,也開始搞伺服器,他說自己的伺服器總是不穩定,於是就

聊到了這個話題,在他現有的專案中,大概有1000個鏈結,每個連線每秒發最大傳送四個資料報。而且

資料報的大小很小。伺服器在做壓力測試的時候,幾乎啥都沒有做,就是接到包,然後回覆,其他的

任務業務邏輯也沒有,連續測試4天,伺服器就掛了。

經過了解,他在開發過程中,用來很執行緒,他覺得伺服器一定要多執行緒來接受資料才快。伺服器為

那麼多人提供服務,一定要多執行緒才可以,否則cpu會忙不過來,他的想法也是大多數人的想法,其實

這就錯了。

我們可以想像一下,網絡卡能處理多少資料,很多程度上受限制與網路速度,一但網路的速度確定了,

基本上就沒有什麼懸念了,例如乙個100m頻寬的網路,換算成大b,也就12m的樣子,如果乙個包大小

為1k,那麼一秒中,我們處理的包數量為 12 * 1024 一萬多個包,如果是乙個包圍100個位元組,我們

可以試想一下,使用乙個單獨的執行緒來接收這些資料報,和使用兩個,或者多個執行緒處理接收這些

資料報,哪乙個時間會更加快呢 ?答案肯定是乙個執行緒接收的快。下面我們來分析下原因,為什麼乙個

執行緒會更快,先看單執行緒的情況:

每次接收不需要做任何的互斥處理,接收就是了,相當於該執行緒只接受資料,其他的事情都沒有做

但是如果是多執行緒接收:那麼就要考慮互斥等問題,如果乙個執行緒正在就誒收乙個資料報,那麼另外乙個執行緒就不能

而不是同時有兩個或者多個執行緒同時工作,而且除了接收資料,還要兼顧執行緒切換工作。

那有些人可能會說了,這個很不對,windows中的iocp(完成埠)就是多執行緒工作的,而且建議使用

多執行緒,iocp確實是多執行緒工作的,但不是接收資料,當我們呼叫iocp的」getqueuedcompletionstatus"函式的時候,其實資料已經

而實際上,接收網路資料報的時間遠比處理業務的時間要短,所以在我們接收到網路資料報以後,做到事情可以並行化

如果可以並行化,那麼就大大的提高了應用成的效能,舉乙個簡單的例子,當客戶端要求計算乙個資料的時候,這個計算

需要花費1秒鐘,那麼如果我們在接收執行緒中處理這個事情,其他的請求將被阻塞,如下圖所示:

但如果是把計算任務放到另外的執行緒中,效果完全不一樣(這個另外的執行緒,我們給他起個名稱)叫業務執行緒,

當然可以用執行緒池的方式,這個就和iocp(完成埠),是一回事情了。今天就說到這裡,限於本人能力有限,

表述不正確的請見諒指正。

關於socket通訊的雜談

用mfc寫了個跟印表機相關的小應用 由於需要接受網路服務端傳來的資料 所以就用到了socket通訊 socket 建立 連線 傳送 接收 關閉 其他都還好 只是接收資料的時候 會出現亂碼 出現的情況是 當有中文字元出現的時候就會出現,這是因為每個中文字元佔兩個位元組 所以接收資料的時候要乙個位元組乙...

如何才能正確的關閉Socket連線

從tcp協議角度來看,乙個已建立的tcp連線有兩種關閉方式,一種是正常關閉,即四次揮手關閉連線 還有一種則是異常關閉,我們通常稱之為連線重置 reset 首先說一下正常關閉時四次揮手的狀態變遷,關閉連線的主動方狀態變遷是fin wait 1 fin wait 2 time wait,而關閉連線的被動...

socket 通訊關於bind那點事

名稱 bind 把名字和套接字相關聯 使用格式 include include intbind intsockfd const struct sockaddr addr socklen t addrlen 功能描述 當用socket 函式建立套接字以後,套接字在命名空間 網路位址族 中存在,但沒有任...