0

我正在尝试将 SSL 功能添加到我现有的 TCP 回显客户端-服务器应用程序中。

早些时候,在我的简单服务器中,我为每个传入的客户端连接生成了一个新的子节点。对于这个孩子,我将 conn-fd (char*) 作为命令行参数传递。(如下图)

execl("./simple_server_instance", conn_fd, NULL);

现在,对于我的安全服务器,我需要传递一个 CYASSL 对象(一个有效的结构)而不是 conn_fd。(如下图)

ssl = CyaSSL_new(ctx);
CyaSSL_set_fd(ssl, connfd);

这里的“ssl”是需要传递给子进程的对象。我尝试了以下方法来实现它,但没有成功。有没有简单的替代方案,还是我应该采用序列化方式?

  1. 将 ssl 对象类型转换为 char*

  2. 创建一个缓冲区并对整个结构进行 memcpy。(如下图)

unsigned char sslobjbuf[sizeof(ssl)];
memcpy(&sslobjbuf, ssl, sizeof(ssl));
execl("./secure_server_instance", "hello", "25", sslobjbuf, NULL );

sdsd

4

1 回答 1

1

当你execl()是一个进程时,你完全用执行的进程替换正在运行的进程。exec函数系列需要一系列以空字符结尾的字符串,这些字符串将在arvg[]生成的应用程序中可用。您不能只通过此接口传递任意对象。

当您可能想要使用fork系统调用时,它会为您提供一个新的子进程,该子进程与父进程共享其代码/数据。的代码./simple_server_instance将与主服务器代码合并。您可以ssl = CyaSSL_new(ctx);在父进程中进行调用以获取所需的对象,然后fork. ssl然后,父级可以在子级运行对象时继续为新请求提供服务。

像这种控制流这样的东西可能会起作用:

while (1) {
    wait_connection();
    pid_t child_pid = -1;
    ssl = CyaSSL_new(ctx);
    child_pid = fork();
    if (child_pid == 0) {
        /* We're now running the child process which also has access to ssl.
         * Run simple_server_instance handler code
         */
    }
    else {
        /* Code running in parent.  Do housekeeping, save child_pid if necessary.
         * clean up ssl, object, get ready for next connection, handle finished
         * child processes.
         */
    }
}
于 2012-08-16T12:30:17.670 回答