【问题标题】:Piping data between two network sockets on Windows在 Windows 上的两个网络套接字之间传输数据
【发布时间】:2012-04-22 16:42:07
【问题描述】:
  1. 给定两个网络套接字,在不以任何方式接触内容的情况下,将数据从一个连接到另一个的最有效方法是什么?

  2. 有没有办法(系统调用 API)来管理内核空间中的套接字到套接字数据管道,类似于 splice provides on Linux? 这就是我目前在 Haskell 中使用 splice 的方式:Using GNU/Linux system call `splice` for zero-copy Socket to Socket data transfers in Haskell

【问题讨论】:

  • @ixe013 因为套接字由内核管理,我假设两端都在内核中:/?
  • 我的意思是调用socket的代码。换句话说,调用socket() 的代码是否在内核模式下运行?我不知道Windows中有这样的功能,但kernel code and user code can share memory。但我相信您需要自己实现内核代码才能利用它。 User mode code has some control over the data 正在发送,但您正在寻找“无触摸”解决方案,所以这不是答案。
  • @ixe013 调用socket()的代码处于用户模式。

标签: windows sockets haskell network-programming


【解决方案1】:

Windows 上的零拷贝 API 称为 TransmitFile。它读取文件句柄并写入套接字——它通常用于从 Web 服务器提供静态文件。我认为您可以提供一个套接字句柄作为文件句柄,因为您通常可以,即使在 Windows 上也是如此。如果是这样,那应该可以解决您的问题。我不确定,因为我没有尝试过,而且文档在这一点上没有明确说明。不过,它是 零拷贝 API,所以如果它不起作用,呃,那当然应该。

【讨论】:

  • 那么TransmitPackets 呢?是不是更像vmsplice
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
相关资源
最近更新 更多