我知道::sendLinux TCP 服務器內的 可以限制有效負載的發送,因此::send需要多次呼叫,直到發送整個有效負載。
即有效載荷是1024位元組
sent_bytes = ::send(fd, ...)其中sent_bytes只有 256 個位元組,所以需要再次呼叫。
有什么方法可以在發送之前確切知道可以發送多少位元組?如果套接字將允許整個訊息,或者該訊息將被分割多少?
示例案例
在同一個 tcp 客戶端上,不同執行緒同時通過 2 條訊息發送到同一個套接字::send()。在某些情況下,如果訊息很大,則需要多次呼叫,::send()因為并非所有位元組都在初始呼叫時發送。因此,使用回圈解決方案,直到發送所有位元組。回圈是互斥的,因此可以看作是執行緒安全的,因此每個執行緒必須一個接一個地執行發送。但是,我擔心的是,因為 Tcp 是一個流,客戶端將接收每條訊息的片段,我在想,如果我知道一次發送多少位元組,為每條訊息添加幀我可以在客戶端重建訊息.
盡管呼叫::send()是按順序完成的,但位元組流是否仍有可能混合?
實際上,這是否會發生:
- 服務器端
- 訊息1:“CiaoCiao”
- 訊息 2:“HelloThere”
- 客戶端
- 收到訊息:“CiaoHelloCiaoThere”
uj5u.com熱心網友回復:
盡管對 ::send() 的呼叫是按順序完成的,但位元組流是否仍有可能混合?
當然。不僅有這樣的機會,而且幾乎可以肯定,在某一時刻。它會在某一時刻發生。保證。
不同執行緒發送到同一個socket
有必要在這個級別處理同步,方法是使用一個互斥鎖,每個執行緒在發送其訊息之前鎖定它并僅在發送整個訊息后解鎖它。
它沒有發送,這留下了一個可能性,即阻塞/掛起的套接字將導致單個執行緒鎖定此互斥鎖過長的時間,直到套接字超時并且您的執行執行緒最終處理失敗send()或write()無論它現在已經在做什么(當然,您正在檢查發送/寫入的回傳值,并適當地處理例外條件)。
沒有單一的、千篇一律的、按數字繪制的解決方案適用于所有情況、每個程式,需要做這樣的事情。每個最終解決方案都需要根據每個程式的獨特要求和目的進行定制。只有一種可能性是處理所有套接字輸入/輸出的專用執行執行緒,并且所有其他執行執行緒將它們的訊息發送到套接字執行緒,而不是直接寫入套接字。這將避免所有執行執行緒被掛起的套接字楔入,代價是增加的記憶體,它保存了所有未發送的資料。
但這只是一種可能的方法。可能的替代解決方案的數量沒有限制。您需要弄清楚哪種基于邏輯/演算法的解決方案最適合您的特定程式。沒有作業系統/內核級別的指示可以為您提供任何關于套接字上的 asend()或write()呼叫將接受的數量的保證。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/429308.html
上一篇:C 中的無限回圈
