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("数字证书信息:\n"); 31 line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); 32 printf("证书: %s\n", line); free(line); 33 line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0); 34 printf("颁发者: %s\n", line); 35 free(line); X509_free(cert); 36 } else 37 printf("无证书信息!\n"); 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("参数格式错误!正确用法如下:\n\t\t%s IP地址端口\n\t比如:\t%s 127.0.0.1 80\n此程序用来从某个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()\n"); 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\n"); 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\n"); 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\n"); 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\n", 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'\n", 124 buffer, errno, err); 125 } 126 else 127 printf("消息'%s'发送成功,共发送了%d个字节!\n", 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个字节的数据\n", 139 buffer, len); 140 else { 141 char err[256] = { 0 }; 142 strerror_s(err, errno); 143 printf("消息接收失败!错误代码是%d,错误信息是'%s'\n", 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:会笑的人,运气通常都会比别人好。
posted on 2020-06-18 17:32 thinkinc999 阅读(531) 评论(0) 编辑 收藏 举报