【问题标题】:Equivalent of dup2 with windows socket in Cdup2 等效于 C 中的 windows 套接字
【发布时间】:2016-11-28 21:46:12
【问题描述】:

我想通过套接字重定向我的标准输入、标准输出和标准错误。

此代码适用于 Linux:

dup2(socket, 0);
dup2(socket, 1);
dup2(socket, 2);

但不是在 Windows 上,因为套接字不是描述符。

如何在 Windows 中执行此操作?

【问题讨论】:

  • “它不起作用”不是一个充分的具体问题描述。阅读How to Ask,听从建议并提供minimal reproducible example
  • @Olaf 它不起作用,因为它没有理由起作用。我认为他/她的意思只是“Windows 上的等效功能是什么?”,而不是“我试过这个并发现了一个问题。”
  • @immibis:没有所需的信息,我们怎么知道?我不是千里眼,无法知道某人的想法/意思。
  • @Olaf 我尝试像在 Linux 中一样使用 dup2,但他不起作用,因为我在 Windows 上工作。我没有找到等价物,所以我在这里问是否有人知道等价物
  • @Olaf 我改写了这个问题 - 更好吗?

标签: c windows sockets redirect dup2


【解决方案1】:

在 Windows 上,Socket API 的返回值是一个SOCKET,它不是一个文件描述符(或者不一定是一个小的非负整数)。但是,它可以在某些方面用作文件句柄,according to MSDN。特别是,您可以将其与ReadFile()WriteFile() 一起使用。

您可以尝试使用 MS 库函数 _open_osfhandle() 将操作系统级别的文件句柄转换为 C 样式的文件描述符。这适用于常规文件,但可能适用于SOCKET。一旦你有了那个文件描述符,你就可以将它传递给_dup2()_fileno(stderr) 作为第二个参数。请务必使用_close() 关闭此描述符,这也会关闭原始句柄。

【讨论】:

  • 谢谢,但我试过这个pastebin.com/utXNQnym,但他不工作
  • 记得给_dup2()close()提供描述符(sck)而不是套接字句柄(sock)。另外,不要使两个变量彼此同音。请检查您的错误代码?它仍然可能无法正常工作。
  • 哦,是的,我修好了。没有错误代码,但我的消息没有发送。它没有出现在控制台或套接字中(我用wireshark看到它)
  • @Switch 似乎这应该工作或抛出错误;如果这不是您的代码中的错误,可能会将其作为系统库中的错误报告给 MS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
相关资源
最近更新 更多