簡體   English   中英

從c中讀取tcp套接字,並在不復制到用戶空間的情況下讀取數據

[英]reading from tcp socket in c, and chucking data without being copied to user space

有一個peek選項,當我可以讀取套接字緩沖區而不實際讀取它(學習可用於后續讀取的字節數)。 fcntl調用有這樣的替代方案。

我想知道是否有辦法實際從套接字緩沖區讀取而不將數據從套接字復制到應用程序緩沖區 因此,如果您願意,可以解決內核問題:在設計Web服務器上的負載創建工具時,目標不是浪費時間復制實際數據:我們需要正確地進行tcp通信,但我們不需要數據接收。 請問有什么建議嗎?

man tcp是你在Linux系統上的朋友:

從版本2.4開始,Linux支持在recv(2)(和recvmsg(2))的flags參數中使用MSG_TRUNC。 此標志導致接收的數據字節被丟棄,而不是在調用者提供的緩沖區中傳回。

因此你可以做(​​例如在TCP套接字上),

   int n = recv(sock_fd, buf, buf_size, MSG_TRUNC);

這將從套接字描述符sock_fd消耗最多buf_size字節,而不實際將它們復制到緩沖區。

recv系統調用與MSG_PEEK標志一起使用。

這個答案本來是一個評論,但它只是為了評論恕我直言。

是的,使用splice(2)性能會提高(如果這是你的瓶頸)(你確定這是你的瓶頸嗎?)。 雖然splice(2)是Linux特定的系統調用,但不應該在便攜式程序中使用。 所以,讓我們看看你的幾個選擇:

  1. splice(2)非常高效但不便攜。
  2. sendfile(2)系統調用是可移植的,但原型在UNIX系統中各不相同。
  3. 為多個操作系統制作包裝功能。
  4. 使用libevent。

IMO你應該使用libevent,它提供了一個可以跨多個平台移植的漂亮界面。

瀏覽Kira提出的提示,讓我了解了使用/ dev / null目標的splice()調用。 現在應該這樣做:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM