我有一個TCP-Brodcast - 服務器與libevent的編碼,從而執行以下操作:將數據寫入多個插座一次(一個系統調用)
Read data from a client
...
Transform the data
...
//Write data to all connected clients
for (int i = 0; i< connected clients; i++){
// write Syscall for every client
write(clientfd[i], "Transformed Data", lenofdata)
}
現在我想提高性能並降低系統的計數調用。 而是在序貫方式來進行系統調用每次我寫一個插座轉換後的數據寫入到每一個插座的,我想只用一個系統調用是這樣寫數據到我所有的連接的客戶端:
Read data from a client
...
Transform the data
...
// one single write Syscall for all connected clients
write(arrayWithManyClientFds, "Transformed Data", lenofdata)
這可能嗎?
編輯: 起初我以爲我找到了一個叫lio_listio會將其被描述here爲beeing的功能,這是「非常重要,因爲它意味着你可以在一個單一的系統調用中啓動大量的I/O的系統調用(意思是一個內核上下文切換)「。
Unfortunalty lio_listio會將()接縫不被工作插座,因爲它是表示here「AIO讀取和插座寫[不支持](不返回一個明確的錯誤,但悄悄默認爲同步或相當的非-AIO行爲)」
,所以我還在尋找一個解決方案,如果有一個!
想象一下,您的服務器有兩個客戶端,一個網絡連接速度非常快,一個網絡連接速度非常慢。 (假設的)TCP writeMany()函數如何處理該問題? –
好點。但是它可以通過異步非阻塞write()(如aio_write)來解決,其中內核處理對每個文件描述符的寫入。你怎麼看? –
我對aio_write()不太熟悉,但我認爲這隻會延遲問題的發生。如果你發送的數據量很大,慢速和快速客戶端的「當前發送位置」將會不斷增加,所以內核最終不得不緩衝RAM中的千兆字節數據(直到慢速客戶端已準備好接收它),或者它必須降低將數據發送到速度最慢的客戶端可以接收的速度。這些都不是一個非常令人滿意的解決方案。 –