c语言传递多个参数给线程,关于ssl多线程参数的传递
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
void *sock_read(int *client) //short event,void *arg
{
char buf[1024];
memset(buf,0,1024);
int d=SSL_read(*client,buf,1024);//接收客戶端的數據包
perror("SSL_read");
printf("d=%d\n",d);
·····
}
static void sock_accept(int server_socket,short event,void *arg)
{
struct event *ev=arg;
int new_server_socket;
char sslbuff[MAXBUF +1];
SSL_CTX *ctx;
RSA *rsa;
X509 * client_cert;
char *str;
SSL_load_error_strings();//為打印調試信息做準備
SSL_library_init();//ssl初始化
OpenSSL_add_all_algorithms();//載入ssl算法
SSL_load_error_strings();//載入ssl錯誤信息
//這里不寫了,太多字數限制,就是載入ssl算法和加入證書、驗證私鑰那些,這里應該沒錯的;
while(1)
{
SSL *ssl;
struct sockaddr_in addr;
socklen_t len=sizeof(addr);
//由于此結構要長期使用,所以rev必須動態分配,否則離開此函數后會自動釋放,導致segment fault
struct event *rev=(struct event *)malloc(sizeof(struct event));
new_server_socket=accept(server_socket,(struct sockaddr *)&addr,&len);
ssl=SSL_new(ctx);
SSL_set_fd(ssl,new_server_socket);
// 建立 SSL 連接
if (SSL_accept(ssl)==-1)
{
close(new_server_socket);
break;
}
client_cert = SSL_get_peer_certificate (ssl); //得到證書并打印信息
if (client_cert != NULL)
{
str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);
if(str==NULL)
{
exit(1);
}
free (str);
str = X509_NAME_oneline (X509_get_issuer_name (client_cert), 0, 0);
if(str==NULL)
{
exit(1);
}
free (str);
X509_free (client_cert);/*如不再需要,需將證書釋放 */
}
else
{
printf ("client does not have certificate.\n");
}
pthread_t child_thread;
pthread_mutex_init(&mutex,NULL);//初始化
if((pthread_create(&child_thread,NULL,(void *)sock_read,(void *)&ssl))<0)//* talk_to_client
if(child_thread!=0)
{
pthread_join(child_thread,NULL);
}
//創建一個讀事件,當有客戶連接時,接收通知。
event_set(rev,new_server_socket,EV_READ,(void*)sock_read,rev);
event_add(rev,NULL);
event_add(ev,NULL);
printf("end sock_accept\n");
free(rev);
// 關閉 SSL 連接
SSL_shutdown(ssl);
SSL_free(ssl);
}
SSL_CTX_free (ctx);
close(new_server_socket);
}
程序中進行的是ssl accept之后參數的傳遞,但是在最上頂的
int d=SSL_read(*client,buf,1024);//接收客戶端的數據包處總是提示:
warning: passing argument 1 of ‘SSL_write’ makes pointer from integer without a cast
類型不匹配,我將int d=SSL_read(*client,buf,1024);改成int d=SSL_read((SSL *)client,buf,1024);會收不到數據,d=-1,但是 perror顯示的是succced,
請問,怎么改?謝謝!
我看過關于openssl不能用于多線程的資料,但是我能不能換種方式,將ssl指針換成其他指針來傳遞,然后將ssl加入到新指針里邊,比如這樣SSL_set_fd(ssl,new_server_socket);
參數傳遞的時候傳遞新的指針,這樣還會起到加密的作用嗎
我按照跟下面的方法試過了
int readFromSSLSocket(SSL *ssl,char *buf,int bufsize,int length_to_read)
{
int nread;
memset(buf,'\0',bufsize);
nread = SSL_read(ssl,buf,length_to_read);
return nread;
}
或者
void *sock_read(void *client)
int d=SSL_read((SSL *)client,buf,1024);
結果都一樣,收不到數據,SSL_read的返回值都是-1
但是我用perror("SSL_read");打出結果,發現狀態是Success,這是怎么回事?
總結
以上是生活随笔為你收集整理的c语言传递多个参数给线程,关于ssl多线程参数的传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: const成员函数
- 下一篇: C语言 main 函数参数 main(i