相关疑难解决方法(0)

两个文件描述符之间的桥接

我有一个我正在做的套接字select(),等待其他进程写入.一旦写入,我读取数据,并将其写入另一个文件描述符.我的问题是,如果有一种方法可以将套接字桥接到文件描述符,那么当数据就绪时,它会自动写入另一个文件描述符?

这样,我可以抛出我正在使用的缓冲区,并省略系统中的一个线程.

c sockets linux file-descriptor

10
推荐指数
2
解决办法
2051
查看次数

使用GNU/Linux系统调用`splice`在Haskell中进行零拷贝Socket到Socket数据传输

更新:Nemo先生的回答有助于解决问题!下面的代码包含修复程序!看到nb Falsenb 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)

sockets linux haskell network-programming splice

7
推荐指数
1
解决办法
2794
查看次数

是否可以要求Linux在套接字读取期间对字节进行黑洞处理?

我有一个在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)

c++ sockets linux

6
推荐指数
1
解决办法
179
查看次数