SSL_accept在调用fork()后挂起 我用OpenSSL在C++中编写一个应用程序,而且我似乎无法让SSL套接字连接工作。p>
我有一个抽象类,通过继承类和简单的TCP和UDP(posix套接字)使用各种协议实现了多个函数 但我无法让ssl正常工作,经过一些代码浏览和调整后,我发现是fork()函数导致了问题 我写了一个非常简单的程序来检查东西,这就是我得到的: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
#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。