【发布时间】:2014-02-14 06:03:51
【问题描述】:
这可能是一个很大的“不”,但我有一个当前的 3 层套接字架构。第 1 层什么都不做,只是设置了必要的步骤以成为一个普通的套接字服务器,然后永远坐在一个循环中调用 accept()。当 accept() 成功返回时,现在打开的套接字通过 sendmsg() 传递到第 2 层程序池,这些程序获取套接字并开始读取内容并将内容保存在临时文件中。然后这个第 2 层程序读取初始数据并确定它应该调用哪个处理程序(第 3 层)程序来处理数据以返回套接字上的响应。目前第 2 层通过 spawnp() 将仍然打开的套接字传递给第 3 层处理程序。第 3 层程序(大约有 20 个不同的程序)处理数据并在 Internet 上的某个地方建立对原始源的响应。我正在寻找使用 GSK 使我的 vanilla 套接字系统适应 SSL,所以我需要一些方法来将 GSK 会话句柄或 something 传递给我的第 3 层程序,但到目前为止还没有成功。这个第 3 层程序是在发送响应后最终在套接字上执行任何最终 close() 的程序。
我可以提供某种图形绘图来展示感兴趣的各方,但我是新来的,不知道这是否可行。
无论如何,我想在 SSL 中使用我当前的代码和鞋拔。目前我在 V7R1 机器上使用 GSK。以我目前的设计,我正在传递套接字,这没什么大不了的,因为它不是。但是,似乎我不能用 SSL 做到这一点,因为它在常规 TCP 之上有自己的 API/协议。我迷路了。如果您不使用 HTTPS,那么关于 SSL 的信息很少,当然,如果您在 400 上使用 C++,则更少。
我的基本问题是如何将打开的 SSL 套接字从一个进程传递到另一个进程?可能吗?
AS/400 的 GSK 信息 http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fapis%2Fgsk_secure_soc_misc.htm
【问题讨论】:
-
在 UNIX 和 Windows 上,socket 是进程私有的东西,所以它不能在进程之间传递。在接受和 SSL 握手发生后,SSL 有很多状态(如密钥),可能无法在程序之间传递。您可能需要合并您的第 2 层和第 3 层,或在您的第 2 层进程中创建第 3 层线程。
-
我正在研究第 3 层程序不通过 SSL 套接字发送它的响应而是通过某种 IPC 方法将其发送回第 2 层程序然后第 2 层程序的可能性将响应传回给发起者。但是,我觉得您关于套接字是进程私有事物的评论是不正确的(尽管我不了解 Windows),因为开放描述符可以通过 sendmsg() 和 recvmsg() 以父子关系非常容易地传递( )。 pubs.opengroup.org/onlinepubs/007908799/xns/sendmsg.html 孩子也继承了 unix 中的开放描述符
-
我的立场是正确的。 UNIX fork/exec 确实传递了打开的套接字。通常认为 fork/exec 成本太高,无法在高性能代码中使用。
-
@brianbeuning UNIX fork/exec 模型实际上非常快,当然,如果您一直在生成新进程,那么保持一个池周围保持运行并传递文件是有意义的管道上的描述符,这正是 OP 正在做的事情。
标签: c++ sockets ssl ibm-midrange