SSL_accept在调用fork()后挂起 我用OpenSSL在C++中编写一个应用程序,而且我似乎无法让SSL套接字连接工作。p>

SSL_accept在调用fork()后挂起 我用OpenSSL在C++中编写一个应用程序,而且我似乎无法让SSL套接字连接工作。p>,c++,linux,sockets,posix,openssl,C++,Linux,Sockets,Posix,Openssl,我有一个抽象类,通过继承类和简单的TCP和UDP(posix套接字)使用各种协议实现了多个函数 但我无法让ssl正常工作,经过一些代码浏览和调整后,我发现是fork()函数导致了问题 我写了一个非常简单的程序来检查东西,这就是我得到的: #include <unistd.h> #include <sys/types.h> #include <sys/time.h> #include <iostream> #include <errno.h&g

我有一个抽象类,通过继承类和简单的TCP和UDP(posix套接字)使用各种协议实现了多个函数

但我无法让ssl正常工作,经过一些代码浏览和调整后,我发现是fork()函数导致了问题

我写了一个非常简单的程序来检查东西,这就是我得到的:

#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <iostream>
#include <errno.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/timeb.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <netdb.h>
#include <time.h>
#include </usr/local/include/ssl/ssl.h>

#include "SSL_CA.cpp"

int main( int argc, char **argv ) {

    int retval;
    SSL_CTX *ctx;
    SSL *con;
    int port = atoi(argv[1]);
    sockaddr_in client_addr;
    sockaddr_in serv_addr;
    socklen_t client_len;
    int max_clients = 40;
    int serv_sock, client_sock;

    if ( ( serv_sock = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
                return -12; 

    SSL_library_init();
    int SSL_CA = NowySSL();
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = port;

cout << "Conf " << endl;

    if ( bind( serv_sock, ( sockaddr * ) &serv_addr, sizeof( serv_addr ) ) < 0 )
        return -1;

    if ( listen( serv_sock, max_clients ) < 0 )
        return -1;


    while (1) {

        cout << "Waiting" << endl;

        if ( ( client_sock = accept( serv_sock, ( sockaddr * ) &client_addr, &client_len ) ) < 0 )
            return -1;

        pid_t pid = fork();

        if ( pid = 0 ) {

            con = NULL;
            ctx = NULL;
            ctx = (SSL_CTX *)SSL_CTX_new( SSLv23_server_method() );
            con = (SSL *)SSL_new( (SSL_CTX *)ctx );

            if (
                !( ( ( !SSL_CA ) && ( SSL_NO_CA_RUN( con, ctx, client_sock, 0 ) ) ) ||
                ( ( SSL_CA ) && ( SSL_CA_RUN( con, ctx, client_sock, true ) ) ) )
            )
                return -1;

            char buf[10];

            if ( ( retval = SSL_read( con, buf, 10  ) ) <= 0 )
                return -16; 
            cout << "Got msg " << buf << " " << retval << endl;

            sprintf(buf, "12345" );

            if ( ( retval = SSL_write( con, buf, strlen(buf) ) ) <= 0 )
                return -1; 

            cout << "Sent" << endl;

        }
        else cout << "Parent " << endl; 
    }

    return 0;
}
如果我不调用fork,一切正常,消息就可以通过,如果fork在那里,它就会卡在ssl\u accept上


有什么帮助吗?

不确定这是打字错误还是你真正的问题,但这不会达到你的目的:

    pid_t pid = fork();

    if ( pid = 0 )
    {
       con = NULL;
       //.............  

您的子代码将无法执行。

不确定这是打字错误还是您真正的问题,但这不会达到您的目的:

    pid_t pid = fork();

    if ( pid = 0 )
    {
       con = NULL;
       //.............  

您的子代码将不会执行。

请参见下面Duck的回答,pid=0是一个赋值操作。您很可能打算执行pid==0。请参见下面Duck的回答,pid=0是一个赋值操作。您很可能打算执行pid==0。