[英]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特定的系統調用,但不應該在便攜式程序中使用。 所以,讓我們看看你的幾個選擇:
splice(2)
非常高效但不便攜。 sendfile(2)
系統調用是可移植的,但原型在UNIX系統中各不相同。 IMO你應該使用libevent,它提供了一個可以跨多個平台移植的漂亮界面。
瀏覽Kira提出的提示,讓我了解了使用/ dev / null目標的splice()調用。 現在應該這樣做:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.