我正在尝试将SSL功能添加到现有的TCP echo客户端 - 服务器应用程序中。
在我的简单服务器中,我为每个传入的客户端连接生成了一个新的子节点。对于这个孩子,我将conn-fd(char *)作为命令行参数传递。 (如下所示)
execl("./simple_server_instance", conn_fd, NULL);
现在,对于我的安全服务器,我需要传递一个CYASSL对象(一个有效的结构)而不是conn_fd。 (如下所示)
ssl = CyaSSL_new(ctx);
CyaSSL_set_fd(ssl, connfd);
这里'ssl'是需要传递给子进程的对象。我尝试了以下方法来实现它,但没有成功。有没有简单的替代方案,还是应该采用序列化方式?
将ssl对象类型化为char *
创建缓冲区并对整个结构执行memcpy。 (如下所示)
unsigned char sslobjbuf[sizeof(ssl)]; memcpy(&sslobjbuf, ssl, sizeof(ssl)); execl("./secure_server_instance", "hello", "25", sslobjbuf, NULL );
sdsd
答案 0 :(得分:1)
当您execl()
进程时,您将使用exec'ed进程完全替换正在运行的进程。 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.
*/
}
}