将HANDLE转换为文件描述符

3
我有一个像这样的HANDLE:
HANDLE hPipe = CreateNamedPipe(...)

是否可以将 hPipe 转换为 文件描述符(int)?

我需要这样做是因为我已经在 C++ 中实现了一个使用 OpenSSL 的 TLS 代码。它在 TCP 套接字上运行得非常好,但我真的需要在命名管道上使用它。

OpenSSL 的函数 SSL_set_fd(SSL *ssl, int fd) 仅接受 文件描述符,即 int,而不是 HANDLE

注意:我还尝试使用以下函数,但它没有起作用(返回值为 3):

int fd = _open_osfhandle(reinterpret_cast<intptr_t>(hPipe), 0);    

我尝试使用"PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT",但_open_osfhandle()仍然返回"3"。调试_open_osfhandle()时似乎没问题...但当我从OpenSSL调用"SSL_accept()"时,它失败了。 - user2538743
"(return 3)"。恭喜,它起作用了。失败则用-1表示。使用的openssl库与程序的其余部分使用相同的CRT的可能性不大,所以没有什么好庆祝的。 - Hans Passant
所以,我们已经确定问题出在SSL_accept,而不是_open_osfhandle吗?你有进入过SSL_accept吗? - Harry Johnston
我无法进入SSL_accept(),因为OpenSSL是一个库,所以当我尝试“步入”SSL_accept()时,调试器的行为就像“跳过”。 - user2538743
OpenSSL的源代码是可用的,如果需要的话,您可以自己构建它。我想他们也有自己的论坛,所以在那里提问可能会很有价值。 - Harry Johnston
显示剩余7条评论
1个回答

4
你得到的3并不是错误,而是文件描述符句柄。如果你查看文档,你会发现它返回-1表示失败,否则返回值是一个文件描述符。

是的,那么奇怪的行为出现在 OpenSSL 上吗? - user2538743
什么奇怪的行为?你的问题是如何从HANDLE获取文件描述符? - Sean
当我在OpenSSL上使用从“_open_osfhandle()”返回的文件描述符时,“SSL_accept()”会返回“-1”,并报告错误“SSL_ERROR_SYSCALL”,因此存在“文件描述符”的问题。 - user2538743

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接