Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio> // printf, scanf
- #include <cstring> // strerror
- #include <cerrno>
- #ifdef _WIN32
- #include <winsock2.h>
- #include <ws2tcpip.h> // getaddrinfo
- #else
- #include <unistd.h> // open, close, read, write
- #include <sys/socket.h> // socket
- #include <netdb.h> // getaddrinfo, gethostbyname
- #include <netinet/in.h> // sockaddr_in, in_addr, ntoh, hton
- #include <arpa/inet.h> // inet_addr, inet_ntoa
- #endif // _WIN32
- #include <openssl/ssl.h>
- using namespace std;
- typedef unsigned int uint;
- typedef unsigned char uchar;
- typedef int fd_t;
- int getLastError()
- {
- #ifdef _WIN32
- return int( WSAGetLastError() );
- #else
- return errno;
- #endif // _WIN32
- }
- bool setTimeout( fd_t sock, uint timeout_ms )
- {
- #ifdef _WIN32
- DWORD timeout = (DWORD)timeout_ms;
- #else
- struct timeval timeout;
- timeout.tv_sec = long( timeout_ms / 1000 );
- timeout.tv_usec = long( timeout_ms % 1000 ) * 1000;
- #endif // _WIN32
- return ::setsockopt( sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout) ) == 0;
- }
- int main( int argc, char * argv [] )
- {
- int port;
- struct addrinfo * ainfo;
- fd_t socketFd;
- SSL_CTX * ctx;
- SSL * ssl;
- char request [1024];
- unsigned char * buffer [1024];
- int received;
- #ifdef _WIN32
- WSADATA wsaData;
- WSAStartup( MAKEWORD(2, 2), &wsaData );
- #endif // _WIN32
- if (argc < 4 || !sscanf(argv[2], "%d", &port)) {
- fprintf( stderr, "usage: %s <hostname> <port> <item>\n", argv[0] );
- return 1;
- }
- const char * hostName = argv[1];
- const char * portStr = argv[2];
- if (getaddrinfo( hostName, portStr, NULL, &ainfo ) != 0)
- {
- fprintf( stderr, " failed to get host info (%d)\n", getLastError() );
- return 2;
- }
- socketFd = socket( ainfo->ai_family, SOCK_STREAM, 0 );
- if (socketFd == -1) {
- fprintf( stderr, " failed to create socket (%d)\n", getLastError() );
- freeaddrinfo( ainfo );
- return 2;
- }
- if (connect( socketFd, ainfo->ai_addr, ainfo->ai_addrlen ) != 0) {
- fprintf( stderr, " failed to connect to %s:%s (%d)\n", hostName, portStr, getLastError() );
- freeaddrinfo( ainfo );
- return 2;
- }
- freeaddrinfo( ainfo );
- if (!setTimeout(socketFd, 5000)) {
- fprintf( stderr, " failed to set timeout\n" );
- return 2;
- }
- SSL_library_init();
- ctx = SSL_CTX_new( SSLv23_client_method() );
- if (!ctx)
- {
- printf( "SSL_CTX_new failed (%d)\n", SSL_get_error( ssl, 0 ) );
- return 3;
- }
- //SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1);
- ssl = SSL_new( ctx );
- if (!ssl)
- {
- printf( "SSL_new failed (%d)\n", SSL_get_error( ssl, 0 ) );
- return 3;
- }
- int r1 = SSL_set_fd( ssl, socketFd );
- if (r1 <= 0)
- {
- printf( "SSL_set_fd failed (%d)\n", SSL_get_error( ssl, r1 ) );
- return 3;
- }
- int r2 = SSL_connect( ssl );
- if (r2 <= 0)
- {
- printf( "SSL_connect failed (%d, %d)\n", SSL_get_error( ssl, r2 ), getLastError() );
- return 3;
- }
- sprintf( request, "GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", argv[3], argv[1] );
- int written = SSL_write( ssl, request, strlen(request) );
- if (written <= 0)
- {
- printf( "write failed (%d)\n", SSL_get_error( ssl, written ) );
- return 3;
- }
- if (!setTimeout( socketFd, 1 )) {
- fprintf( stderr, " failed to set timeout\n" );
- return 2;
- }
- while (true)
- {
- received = SSL_read( ssl, buffer, sizeof(buffer) );
- if (received > 0)
- {
- printf( "(%d) %*s\n", received, received, buffer ); fflush( stdout );
- }
- else if (received == 0)
- {
- printf( "connection closed\n" ); fflush( stdout );
- break;
- }
- else
- {
- int error = SSL_get_error( ssl, received );
- printf( "read failed (%d, %d)\n", error, getLastError() ); fflush( stdout );
- break;
- }
- while (getchar() != '\n') {}
- }
- SSL_shutdown( ssl );
- SSL_free( ssl );
- SSL_CTX_free( ctx );
- #ifdef _WIN32
- closesocket(socketFd);
- WSACleanup();
- #else
- close( socketFd );
- #endif // _WIN32
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment