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);