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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/9/27 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言传递多个参数给线程,关于ssl多线程参数的传递 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓

void *sock_read(int *client) //short event,void *arg

{

char buf[1024];

memset(buf,0,1024);

int d=SSL_read(*client,buf,1024);//接收客戶端的數(shù)據(jù)包

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();//為打印調(diào)試信息做準(zhǔn)備

SSL_library_init();//ssl初始化

OpenSSL_add_all_algorithms();//載入ssl算法

SSL_load_error_strings();//載入ssl錯(cuò)誤信息

//這里不寫(xiě)了,太多字?jǐn)?shù)限制,就是載入ssl算法和加入證書(shū)、驗(yàn)證私鑰那些,這里應(yīng)該沒(méi)錯(cuò)的;

while(1)

{

SSL *ssl;

struct sockaddr_in addr;

socklen_t len=sizeof(addr);

//由于此結(jié)構(gòu)要長(zhǎng)期使用,所以rev必須動(dòng)態(tài)分配,否則離開(kāi)此函數(shù)后會(huì)自動(dòng)釋放,導(dǎo)致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); //得到證書(shū)并打印信息

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);/*如不再需要,需將證書(shū)釋放 */

}

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

}

//創(chuàng)建一個(gè)讀事件,當(dāng)有客戶連接時(shí),接收通知。

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

// 關(guān)閉 SSL 連接

SSL_shutdown(ssl);

SSL_free(ssl);

}

SSL_CTX_free (ctx);

close(new_server_socket);

}

程序中進(jìn)行的是ssl accept之后參數(shù)的傳遞,但是在最上頂?shù)?/p>

int d=SSL_read(*client,buf,1024);//接收客戶端的數(shù)據(jù)包處總是提示:

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);會(huì)收不到數(shù)據(jù),d=-1,但是 perror顯示的是succced,

請(qǐng)問(wèn),怎么改?謝謝!

我看過(guò)關(guān)于openssl不能用于多線程的資料,但是我能不能換種方式,將ssl指針換成其他指針來(lái)傳遞,然后將ssl加入到新指針里邊,比如這樣SSL_set_fd(ssl,new_server_socket);

參數(shù)傳遞的時(shí)候傳遞新的指針,這樣還會(huì)起到加密的作用嗎

我按照跟下面的方法試過(guò)了

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

結(jié)果都一樣,收不到數(shù)據(jù),SSL_read的返回值都是-1

但是我用perror("SSL_read");打出結(jié)果,發(fā)現(xiàn)狀態(tài)是Success,這是怎么回事?

總結(jié)

以上是生活随笔為你收集整理的c语言传递多个参数给线程,关于ssl多线程参数的传递的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。