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

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. jmeter根据循环获取参数_Jmeter--同线程组循环获取数据库数据传递请求

    实例:同线程组从数据库内获取3个uid,把3个uid分别作为不同参数,循环传递给T票UI及发布朋友圈接口.最终结果分别请求了3次接口,并且每个接口请求uid均不一致 jmeter整体结构 1.连接数据 ...

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

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 void *sock_read(int *client) //short event,void *arg { char buf[1024]; memset ...

  3. java new thread参数_java线程池01-ThreadPoolExecutor构造方法参数的使用规则

    为了更好的使用多线程,JDK提供了线程池供开发人员使用,目的在于减少线程的创建和销毁次数,以此达到线程的重复利用. 其中ThreadPoolExecutor是线程池中最核心的一个类,我们先简单看一下这 ...

  4. linux线程多参数传递参数,Linux中多线程编程并传递多个参数

    解析Linux中多线程编程并传递多个参数 Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容. Linux下的多线程编程,并将多个参数传递给线程要执行的函数. 以下是实验程序 ...

  5. C#创建带参数的线程

    1.无参数线程的创建 Thread thread = new Thread(new ThreadStart(ShowMessage)); thread.Start(); private void Sh ...

  6. c语言程序的命令行输入,C程序获取命令行参数

    命令行参数 命令行界面中,可执行文件可以在键入命令的同一行中获取参数用于具体的执行命令.无论是Python.Java还是C等等,这些语言都能够获取命令行参数(Command-line argument ...

  7. c语言第一个mfc程序,c语言之MFC的进程和线程

    MFC的进程和线程 1.Win32的进程和线程概念 进程是:一个可执行的程序,由私有虚拟地址空间.代码.数据和其他操作系统资源(如进程创建的文件.管道.同步对象等)组成.一个应用程序可以有一个或多个进 ...

  8. c语言 多线程 参数,如何用C语言实现多线程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...

  9. [转载] c语言中检查命令行参数_C中的命令行参数

    参考链接: Java中的命令行参数 c语言中检查命令行参数 Command line argument is a parameter supplied to the program when it i ...

最新文章

  1. 根据API创建BOM(Itpub)
  2. 通过几个例子看sed的模式空间与保持空间
  3. php+读取配置里的值,ThinkPHP 读取配置信息与动态配置(C方法)
  4. 【推荐】最全的积分墙基础知识大全:积分墙渠道运营那些事儿
  5. Python字符与字节新编
  6. GDCM:rle转img文件的测试程序
  7. 处理时间_7_60个Mysql日期时间函数汇总
  8. python的总结与心得词云设计理念_Python编程语言:使用词云来表示学习和工作报告的主题...
  9. http://www.tldp.org/LDP/abs/abs-guide.txt.gz
  10. 今天发个技术贴,增加自信心
  11. Java Maps的9个常见问题
  12. 人是中国开源产业发展的战略制高点
  13. MyCat分片规则之取模分片
  14. 软件测试工程师相关证书
  15. 计算机网络共享文件密码,如何给局域网共享文件夹设置访问密码
  16. 扒一扒有限元的那些书
  17. 【Python+Excel】批量操作Excel工作表和工作簿的5个实例
  18. ABAP报表程序结构框架
  19. 阿朱:企业信息化十年
  20. ESXI6.7升级至ESXI7及各问题的解决

热门文章

  1. 计算图像的直方图,求峰值点
  2. 【指标需求思考】如何做好指标类需求建设
  3. EMR on ACK 全新发布,助力企业高效构建大数据平台
  4. 项目版本管理的最佳实践:云效飞流Flow篇
  5. 首度公开!OceanBase存储系统架构的演进历程及工程实践
  6. MongoDB副本集同步原理
  7. 数据不足,如何进行迁移学习?
  8. 阿里云DDoS高防 - 访问与攻击日志实时分析(三)
  9. 低代码发展专访系列之一:低代码平台产品的使用者都是谁?
  10. 阿里的 RocketMQ 如何让双十一峰值之下0故障