我正在尝试将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 对象类型转换为字符*
创建一个缓冲区并对整个结构进行记忆。(如下所示)
unsigned char sslobjbuf[sizeof(ssl)]; memcpy(&sslobjbuf, ssl, sizeof(ssl)); execl("./secure_server_instance", "hello", "25", sslobjbuf, NULL );
SDSD
execl()
进程时,将正在运行的进程完全替换为执行的进程。 exec
系列函数需要一系列以 null 结尾的字符串,这些字符串将在生成的应用程序中作为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.
*/
}
}