zoukankan      html  css  js  c++  java
  • OpenSSL socket客户端

    这是我从网上找来的,改好了的。

    需要添加一下include 和 lib 路径

      1 #define WIN32_LEAN_AND_MEAN
      2 
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <errno.h>
      6 #include <string.h>
      7 #include <sys/types.h>
      8 #include <Windows.h>
      9 #include <WinSock2.h>
     10 #include <MSWSock.h>
     11 #include <WS2tcpip.h>
     12 #include <openssl/ssl.h>
     13 #include <openssl/err.h>
     14 #pragma comment(lib, "ws2_32.lib")
     15 #pragma comment(lib, "libssl.lib")
     16 #pragma comment(lib, "libcrypto.lib")
     17 #pragma comment(lib, "Crypt32.lib")
     18 #define bzero ZeroMemory
     19 #define close closesocket
     20 
     21 #define MAXBUF 1024
     22 
     23 void ShowCerts(SSL * ssl)
     24 {
     25     X509 *cert;
     26     char *line;
     27     cert = SSL_get_peer_certificate(ssl);
     28     if (cert != NULL)
     29     {
     30         printf("数字证书信息:
    ");
     31         line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
     32         printf("证书: %s
    ", line);        free(line);
     33         line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
     34         printf("颁发者: %s
    ", line);
     35         free(line);        X509_free(cert);
     36     } else
     37         printf("无证书信息!
    ");
     38 }
     39 
     40 /************关于本文档********************************************
     41  *************filename: ssl-client.c
     42  **************purpose: 演示利用OpenSSL 库进行基于IP层的SSL 加密通讯的方法,这是客户端例子
     43  ***********************************************************************************/
     44 
     45 int main(int argc, char **argv){
     46     SOCKET sockfd, len;
     47     struct sockaddr_in dest;
     48     char buffer[MAXBUF + 1];
     49     SSL_CTX *ctx;    SSL *ssl;
     50     if (argc != 3)
     51     {
     52         printf("参数格式错误!正确用法如下:
    		%s IP地址端口
    	比如:	%s 127.0.0.1 80
    此程序用来从某个IP 地址的服务器某个端口接收最多MAXBUF 个字节的消息",             argv[0], argv[0]);
     53         exit(0);
     54     }
     55 
     56     /* SSL 库初始化,参看ssl-server.c 代码*/
     57     SSL_library_init();
     58     OpenSSL_add_all_algorithms();
     59     SSL_load_error_strings();
     60     //      SSL_CTX_new(SSLv23_server_method());
     61     ctx = SSL_CTX_new(SSLv23_client_method());
     62     if (ctx == NULL) {
     63         ERR_print_errors_fp(stdout);
     64         exit(1);
     65     }
     66 
     67     WSADATA wsaData;
     68     int iResult = 0;
     69     iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
     70     if (iResult != NO_ERROR) {
     71         wprintf(L"Error at WSAStartup()
    ");
     72         return 1;
     73     }
     74 
     75     /* 创建一个socket 用于tcp 通信*/
     76     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
     77     {
     78         perror("Socket");
     79         exit(errno);
     80     }
     81 
     82     printf("socket created
    ");
     83 
     84 
     85     /* 初始化服务器端(对方)的地址和端口信息*/
     86     bzero(&dest, sizeof(dest));
     87     dest.sin_family = AF_INET;
     88     dest.sin_port = htons(atoi(argv[2]));
     89 
     90     if (inet_pton(AF_INET, argv[1], &dest.sin_addr.s_addr) == 0) {
     91         perror(argv[1]);
     92         exit(errno);
     93     }
     94     printf("address created
    ");
     95     /* 连接服务器*/
     96     if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
     97         printf("Connect error:%d", WSAGetLastError());
     98         exit(errno);
     99     }
    100     printf("server connected
    ");
    101     /* 基于ctx 产生一个新的SSL */
    102     ssl = SSL_new(ctx);
    103     SSL_set_fd(ssl, sockfd);
    104     /* 建立SSL 连接*/
    105     if (SSL_connect(ssl) == -1)
    106         ERR_print_errors_fp(stderr);
    107     else {
    108         printf("Connected with %s encryption
    ",
    109             SSL_get_cipher(ssl));
    110         ShowCerts(ssl);
    111     }
    112 
    113 
    114     bzero(buffer, MAXBUF + 1);
    115     strcpy_s(buffer,MAXBUF,  "from client->server");
    116 
    117     /* 发消息给服务器*/
    118     len = SSL_write(ssl, buffer, strlen(buffer));
    119     if (len < 0)
    120     {
    121         char err[256] = { 0 };
    122         strerror_s(err, errno);
    123         printf("消息'%s'发送失败!错误代码是%d,错误信息是'%s'
    ",
    124             buffer, errno, err);
    125     }
    126     else
    127         printf("消息'%s'发送成功,共发送了%d个字节!
    ",
    128             buffer, len);
    129 
    130 
    131 
    132     /* 接收对方发过来的消息,最多接收MAXBUF 个字节*/
    133     bzero(buffer, MAXBUF + 1);
    134 
    135     /* 接收服务器来的消息*/
    136     len = SSL_read(ssl, buffer, MAXBUF);
    137     if (len > 0)
    138         printf("接收消息成功:'%s',共%d个字节的数据
    ",
    139             buffer, len);
    140     else {
    141         char err[256] = { 0 };
    142         strerror_s(err, errno);
    143         printf("消息接收失败!错误代码是%d,错误信息是'%s'
    ",
    144             errno, err);
    145         goto finish;
    146     }
    147 
    148 finish:
    149     /* 关闭连接*/
    150     SSL_shutdown(ssl);
    151     SSL_free(ssl);
    152     close(sockfd);
    153     SSL_CTX_free(ctx);
    154 
    155     return 0;
    156 
    157 }


    PS:会笑的人,运气通常都会比别人好。
  • 相关阅读:
    2020 HDU校赛 Problem J
    2020 HDU校赛 Problem I
    2020年HDU校赛 Problem A
    HDU 2553 N皇后 (dfs+回溯)
    D
    #6177. 「美团 CodeM 初赛 Round B」送外卖2(floyed + 三进制枚举 )
    E
    B
    大数加法模板(可能有问题,目前没发现)
    H
  • 原文地址:https://www.cnblogs.com/thinkinc999/p/13158758.html
Copyright © 2011-2022 走看看