该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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多线程参数的传递相关推荐

  1. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

  2. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  3. c语言多线程面试题,iOS面试题--网络多线程

    一.多线程的底层实现? 1>线程:Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程 2>开发中很少用Mach级的线程,因为Mach级的线程没有提供多 ...

  4. c 语言 宏 可变 参数,利用C可变参数和宏定义来实现自己的日志系统

    在嵌入式应用的开发过程中,日志系统是非常重要的! 特别是在生产环节出现了偶发性的.与当前的执行环境相关的bug的时候, 如果没有日志系统来追踪问题,很难进行问题重现. 因此,实现一个自己的日志系统是很 ...

  5. c语言 可变参数的宏,可变参数的宏__ VA_ARGS__的用法

    回顾 在[ANSIC几种特殊的标准定义]中我们讲述了比较常用的几项: __FILE__:正在编译文件的路径及文件名 __LINE__:正在编译文件的行号 __DATE__:编译时刻的日期字符串 如&q ...

  6. R语言caret包构建xgboost模型实战:特征工程(连续数据离散化、因子化、无用特征删除)、配置模型参数(随机超参数寻优、10折交叉验证)并训练模型

    R语言caret包构建xgboost模型实战:特征工程(连续数据离散化.因子化.无用特征删除).配置模型参数(随机超参数寻优.10折交叉验证)并训练模型 目录

  7. 利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma

    该案例展示了如何利用进化算法+多进程/多线程来优化SVM中的两个参数:C和Gamma. 在执行本案例前,需要确保正确安装sklearn,以保证SVM部分的代码能够正常执行. 本函数需要用到一个外部数据 ...

  8. python一个函数可以有参数也可以没有参数_python 传入任意多个参数(方法调用可传参或不传参)...

    1.可传参数与不传参数,在定义中给参数设置默认值 class HandleYmal: """ 获取测试环境的配置 """ def __ini ...

  9. ML之SVM:利用SVM算法(超参数组合进行多线程网格搜索+3fCrVa)对20类新闻文本数据集进行分类预测、评估

    ML之SVM:利用SVM算法(超参数组合进行多线程网格搜索+3fCrVa)对20类新闻文本数据集进行分类预测.评估 目录 输出结果 设计思路 核心代码 输出结果 Fitting 3 folds for ...

最新文章

  1. 使用命令接口对KVM虚拟机进行简单的管理
  2. gridcontrol 验证错误_值得品读的人生感悟句子,生气,是拿别人的错误惩罚自己...
  3. java 定义多个变量_学了Java才搞懂JMeter测试计划
  4. Redis在本地安装与启动
  5. 点云定义、PCL数据类型和点云处理方式
  6. Android 8(1),腾讯字节爱奇艺网易华为实习面试汇总
  7. python去除图片复杂背景_去掉图片黑背景输出为透明背景
  8. Windows jdk下载与安装
  9. 2021李宏毅作业hw3 --食物分类。对比出来的80准确率。
  10. python 吉他_Python中用于比较吉他弦的Matplotlib幅值_频谱单位
  11. 电源管理芯片TMI6201A,助力电池供电系统超长续航更有价值!
  12. 使用Java在浏览器页面无法导出excel表格
  13. Sendgrid 发信失败!错误代码421.5.7.1 是什么原因?
  14. C# 实现xls类型转换为xlsx类型
  15. 拥挤城市小程序如何玩转会展营销?
  16. PHP7新特性(常用)
  17. Makefile文件名称
  18. 大都会人寿培训第二天
  19. SAP migo增强
  20. poco新增对cocos c++项目的支持~

热门文章

  1. C#实现RSA加密解密
  2. oracle case when exists()
  3. 使用 soapUI 测试 REST 服务
  4. Web API应用架构设计分析(2)
  5. 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]...
  6. 定时修改列表 服务器版,Unity定时回调(服务端不依赖Update)
  7. 查看mysql主从配置的状态及修正 slave不启动问题
  8. Vim杂记:Sublime的配色方案
  9. 给array添加元素_前囧(06篇)Array 方法详解
  10. PHP中的des加密类