日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言多线程多个传入参数,关于ssl多线程参数的传递

發布時間:2024/9/18 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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多线程参数的传递的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。