读书人

openssl多线程范例

发布时间: 2012-07-18 12:05:40 作者: rapoo

openssl多线程实例

?????? dest_sin.sin_port = htons( 1111 );

?

again:

?????? err=connect( sock,(PSOCKADDR) &dest_sin, sizeof( dest_sin));

?????? if(err<0)

?????? {

????????????? Sleep(1);

????????????? goto again;

?????? }

??? ssl = SSL_new (ctx);????????????????????????

?????? if(ssl==NULL)

?????? {

????????????? printf("ss new err\n");

????????????? return ;

?????? }

?????? SSL_set_fd(ssl,sock);

? ??? err = SSL_connect (ssl);????????????????????

? ??? if(err<0)

?????? {

????????????? printf("SSL_connect err\n");

????????????? return;

?????? }

? ??? printf ("SSL connection using %s\n", SSL_get_cipher (ssl));

? ??? server_cert = SSL_get_peer_certificate (ssl);??????

? ??? printf ("Server certificate:\n");

? ??? str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);

? ??? printf ("\t subject: %s\n", str);

? ??? OPENSSL_free (str);

? ??? str = X509_NAME_oneline (X509_get_issuer_name? (server_cert),0,0);

? ??? printf ("\t issuer: %s\n", str);

? ??? OPENSSL_free (str); ?

? ??? X509_free (server_cert);

?????? err = SSL_write (ssl, "Hello World!", strlen("Hello World!"));

?????? if(err<0)

?????? {

????????????? printf("ssl write err\n");

????????????? return ;

?????? }

#if 0

?????? memset(buf,0,ONE_BUF_SIZE);

? ??? err = SSL_read (ssl, buf, sizeof(buf) - 1);??????????????????

?????? if(err<0)

?????? {

????????????? printf("ssl read err\n");

????????????? return ;

?????? }

? ??? buf[err] = '\0';

? ??? printf ("Got %d chars:'%s'\n", err, buf);

#endif

? ??? SSL_shutdown (ssl);? /* send SSL/TLS close_notify */

? ??? SSL_free (ssl);

?????? closesocket(sock);

}

?

int??? main ()

{

?????? int ???????? err,buflen,read;

? ??? int ???????? sd;

?

?????? struct ?????????? sockaddr_in dest_sin;

?????? SOCKETsock;

?????? PHOSTENT phe;

?????? WORD wVersionRequested;

?????? WSADATA wsaData;

? ??? SSL_CTX???????????? *ctx;

? ??? SSL??????? *ssl;

? ??? X509???????????? *server_cert;

? ??? char?? ? *str;

? ??? char??????? buf [1024];

? ??? SSL_METHOD ??? *meth;

?????? int?????????? i;

?????? pthread_tpid[MAX_T];

? ???

? ??? SSLeay_add_ssl_algorithms();

? ??? meth = SSLv3_client_method();

? ??? SSL_load_error_strings();

? ??? ctx = SSL_CTX_new (meth);??????????????????????

?????? if(ctx==NULL)

?????? {

????????????? printf("ssl ctx new eer\n");

????????????? return -1;

?????? }

?

?????? if (SSL_CTX_use_certificate_file(ctx, CLIENTCERT, SSL_FILETYPE_PEM) <= 0)

??? {

??????? ERR_print_errors_fp(stderr);

??????? exit(3);

??? }

??? if (SSL_CTX_use_PrivateKey_file_pass(ctx, CLIENTKEY, "123456") <= 0)

??? {

???????? ERR_print_errors_fp(stderr);

???????? exit(4);

??? ?}

?????? lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));

?????? lock_count=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));

?????? for (i=0; i<CRYPTO_num_locks(); i++)

?????? {

????????????? lock_count[i]=0;

????????????? pthread_mutex_init(&(lock_cs[i]),NULL);

?????? }

?????? CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id);

?????? CRYPTO_set_locking_callback((void (*)())pthreads_locking_callback);

?????? for(i=0;i<MAX_T;i++)

?????? {???????????

????????????? err=pthread_create(&(pid[i]),NULL,&thread_main,(void *)ctx);

????????????? if(err!=0)

????????????? {

???????????????????? printf("pthread_create err\n");

???????????????????? continue;

????????????? }

?????? }

?????? for (i=0; i<MAX_T; i++)

?????? {

????????????? pthread_join(pid[i],NULL);

?????? }

? ??? SSL_CTX_free (ctx);

? ??? printf("test ok\n");

?????? return 0;

}

上述程序在windows下运行成功,采用了windows下的开源pthread库。

需要注意的是,如果多线程用openssl,需要设置两个回调函数

CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id);

CRYPTO_set_locking_callback((void (*)())pthreads_locking_callback);

读书人网 >行业软件

热点推荐