| /* echoclient.c */ | |
| #include "openssl/ssl.h" | |
| #include "../test.h" | |
| int main(int argc, char** argv) | |
| { | |
| SOCKET_T sockfd = 0; | |
| FILE* fin = stdin; | |
| FILE* fout = stdout; | |
| int inCreated = 0; | |
| int outCreated = 0; | |
| char send[1024]; | |
| char reply[1024]; | |
| SSL_METHOD* method = 0; | |
| SSL_CTX* ctx = 0; | |
| SSL* ssl = 0; | |
| #ifdef _WIN32 | |
| WSADATA wsd; | |
| WSAStartup(0x0002, &wsd); | |
| #endif | |
| if (argc >= 2) { | |
| fin = fopen(argv[1], "r"); | |
| inCreated = 1; | |
| } | |
| if (argc >= 3) { | |
| fout = fopen(argv[2], "w"); | |
| outCreated = 1; | |
| } | |
| if (!fin) err_sys("can't open input file"); | |
| if (!fout) err_sys("can't open output file"); | |
| tcp_connect(&sockfd); | |
| method = SSLv3_client_method(); | |
| ctx = SSL_CTX_new(method); | |
| if (SSL_CTX_load_verify_locations(ctx, caCert, 0) != SSL_SUCCESS) | |
| err_sys("can't load ca file"); | |
| ssl = SSL_new(ctx); | |
| SSL_set_fd(ssl, sockfd); | |
| if (SSL_connect(ssl) != SSL_SUCCESS) err_sys("SSL_connect failed"); | |
| while (fgets(send, sizeof(send), fin)) { | |
| int sendSz = strlen(send) + 1; | |
| if (SSL_write(ssl, send, sendSz) != sendSz) | |
| err_sys("SSL_write failed"); | |
| if (strncmp(send, "quit", 4) == 0) { | |
| fputs("sending server shutdown command: quit!\n", fout); | |
| break; | |
| } | |
| if (SSL_read(ssl, reply, sizeof(reply)) > 0) | |
| fputs(reply, fout); | |
| } | |
| SSL_shutdown(ssl); | |
| SSL_free(ssl); | |
| SSL_CTX_free(ctx); | |
| fflush(fout); | |
| if (inCreated) fclose(fin); | |
| if (outCreated) fclose(fout); | |
| #ifdef _WIN32 | |
| closesocket(sockfd); | |
| #else | |
| close(sockfd); | |
| #endif | |
| return 0; | |
| } | |