我有一个我正在做的套接字select()
,等待其他进程写入.一旦写入,我读取数据,并将其写入另一个文件描述符.我的问题是,如果有一种方法可以将套接字桥接到文件描述符,那么当数据就绪时,它会自动写入另一个文件描述符?
这样,我可以抛出我正在使用的缓冲区,并省略系统中的一个线程.
更新:Nemo先生的回答有助于解决问题!下面的代码包含修复程序!看到nb False
和nb True
下面调用.
还有一个新的Haskell包被称为splice
(具有特定于操作系统的便携式实现,这是一种最着名的socket到socket数据传输循环).
我有以下(Haskell)代码:
#ifdef LINUX_SPLICE
#include <fcntl.h>
{-# LANGUAGE CPP #-}
{-# LANGUAGE ForeignFunctionInterface #-}
#endif
module Network.Socket.Splice (
Length
, zeroCopy
, splice
#ifdef LINUX_SPLICE
, c_splice
#endif
) where
import Data.Word
import Foreign.Ptr
import Network.Socket
import Control.Monad
import Control.Exception
import System.Posix.Types
import System.Posix.IO
#ifdef LINUX_SPLICE
import Data.Int
import Data.Bits
import Unsafe.Coerce
import Foreign.C.Types
import Foreign.C.Error
import System.Posix.Internals
#else
import System.IO
import Foreign.Marshal.Alloc
#endif
zeroCopy :: Bool
zeroCopy =
#ifdef …
Run Code Online (Sandbox Code Playgroud) 我有一个在Linux Debian 9下运行的c ++程序。我正在从文件描述符中进行简单的read():
int bytes_read = read(fd, buffer, buffer_size);
Run Code Online (Sandbox Code Playgroud)
想象一下,我想从套接字读取更多数据,但是我想先跳过一个已知的字节数,然后再获取我感兴趣的某些内容:
int unwanted_bytes_read = read(fd, unwanted_buffer, bytes_to_skip);
int useful_bytes = read(fd, buffer, buffer_size);
Run Code Online (Sandbox Code Playgroud)
在Linux中,是否存在一个系统范围内的“内置”位置,我可以将不需要的字节转储到该位置,而不必维护不需要的数据的缓冲区(unwanted_buffer
如上例所示)?
我想我要寻找的东西MSG_PEEK
与套接字世界相反(即),也就是说,内核将bytes_to_skip
在下一个有用的recv调用之前从其接收缓冲区中清除。
如果我正在从文件中读取内容,lseek
那就足够了。但是,如果您正在从套接字读取并且正在使用分散/聚集I / O,并且要删除其中一个字段,则这是不可能的。
我正在考虑这样的事情:
// send side
int a = 1;
int b = 2;
int c = 3;
struct iovec iov[3];
ssize_t nwritten;
iov[0].iov_base = &a;
iov[0].iov_len = sizeof(int);
iov[1].iov_base = &b;
iov[1].iov_len = sizeof(int);
iov[2].iov_base = &c;
iov[2].iov_len = sizeof(int);
nwritten = writev(fd, iov, 3); …
Run Code Online (Sandbox Code Playgroud)