我一直在编写一个有趣的程序,可以在Linux上用C语言通过TCP传输文件.程序从套接字读取文件并将其写入文件(反之亦然).我最初使用读/写和程序正常工作,但后来我学习了拼接,并想尝试一下.
我用splice编写的代码在从stdin(重定向文件)读取并写入TCP套接字时非常有效,但在从套接字读取并写入stdout时,会立即将splice设置errno设置为EINVAL.手册页指出当两个描述符都不是管道(不是这种情况)时,EINVAL被设置,为无法搜索的流传递偏移量(没有传递偏移量),或文件系统不支持拼接,这导致我我的问题:这是否意味着TCP可以拼接的管道,而不是到?
我包括下面的代码(减去错误处理代码),希望我做错了.它主要基于维基百科的拼接示例.
static void splice_all(int from, int to, long long bytes)
{
long long bytes_remaining;
long result;
bytes_remaining = bytes;
while (bytes_remaining > 0) {
result = splice(
from, NULL,
to, NULL,
bytes_remaining,
SPLICE_F_MOVE | SPLICE_F_MORE
);
if (result == -1)
die("splice_all: splice");
bytes_remaining -= result;
}
}
static void transfer(int from, int to, long long bytes)
{
int result;
int pipes[2];
result = pipe(pipes);
if (result == -1)
die("transfer: pipe"); …Run Code Online (Sandbox Code Playgroud) 在我正在开发的应用程序中,我splice在Linux上用于套接字到套接字数据传输.
splice或等效的解决方案?splice使用sendfile¹+ memmap¹ 模拟Windows上的套接字到套接字数据?¹两者都存在于不同名称的Windows上,我不记得了.
更新
您可以splice在Linux上看到vs用户空间缓冲区的性能改进.
DF,DR,F,MF,MR是我在不同隧道模式的应用,NX是NGINX Web服务器-p+t 使用Linux系统调用 splice+p-t 使用带有用户空间缓冲区的便携式实现+p+t 使用具有用户空间缓冲区和多个OS线程的可移植实现注意: 对于那些无法做出比无聊,无知的评论甚至是关闭有效问题的建议更好的人,请在此处查看接受的答案:使用GNU/Linux系统调用`splice`进行零拷贝Socket to Socket Haskell中的数据传输是如何为那些真正寻求建设性答案的人提供适当帮助的一个很好的例子!
嗨,我刚刚阅读PowerMod了Mathematica 8的文档,想要测试Haksell RSA包(ghc --make -O2 -O3 -fllvm -optlo-O3 test.hs):
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad
import System.Random
import Codec.Crypto.RSA
import Data.ByteString.Lazy
import Data.ByteString.Char8
import Criterion.Main
import Criterion.Config
main :: IO ()
main = do
print m1
print m4
print m8
defaultMainWith defaultConfig (return ()) [
bgroup "RSA" [
bench "1" $ ed m1
, bench "4" $ ed m4
, bench "8" $ …Run Code Online (Sandbox Code Playgroud) c ×1
haskell ×1
linux ×1
openssl ×1
performance ×1
pipe ×1
rsa ×1
sockets ×1
splice ×1
system-calls ×1