SSL на сокетах [С++]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by C@T, 3 Feb 2012.

  1. C@T

    C@T Member

    Joined:
    7 Sep 2011
    Messages:
    12
    Likes Received:
    6
    Reputations:
    10
    Вообщем возникла проблема того что нужно было заменить OpenSSL чем то другим, в связи с тем что OpenSSL , блин, весит почти метр :D

    Спасибо SLESH'у за то что он подсказал заюзать winssl.dll , которая весит всего лишь 6 кб, немного погуглил и все таки нашел исходники этой dll , впихнул их в свою прогу, и все отлично заработало, поэтому решил выложить результат

    файл: http://miron.in/370817 // SSL.h

    Использование:
    Code:
    #pragma comment (lib,"ws2_32.lib")
    
    #include <winsock2.h>
    #include <iostream>
    #include <windows.h>
    #include <stdio.h>
    #include <string>
    
    #include "SSL.h "
    
    using namespace std;
    
    in_addr LookUpName(string Host){
    	hostent* h;
    	in_addr Buf = {0};
    
    	h = gethostbyname(Host.c_str());
    	if(h == 0) return Buf; 
    	Buf.S_un.S_addr = *((unsigned long*)(*((*h).h_addr_list)));
    	return Buf;
    }
    
    int ConnectToHost(SOCKET Sock, string Host, int port){
    	sockaddr_in Addr;
    	if(Host == ""){
    		return -1;
    	}
    	Addr.sin_family = AF_INET;
    	Addr.sin_port = htons(port);
    	Addr.sin_addr = LookUpName(Host);
    	return connect(Sock,(sockaddr*)&Addr,sizeof(Addr));
    }
    
    SSL_CTX* ctx;
    SSL* ssl;
    
    void init()
    {
    	int ret = SSL_library_init(); 
    	ctx = SSL_CTX_new(SSLv23_client_method());
    	ssl =  SSL_new(ctx);
    }
    
    void SSLconnect(string host, int port)
    {
    	SOCKET Sock = socket(AF_INET, SOCK_STREAM, 0);
    
    	int ret = ConnectToHost(Sock, host, port);
    	ret = SSL_set_fd(ssl, Sock);
    	ret = SSL_connect(ssl);
    	cout << "";
    }
    
    int main()
    {
    	WSADATA wsa;
    	WSAStartup(0x0202,&wsa);
    
    	cout << "ololo\r\n";
    	init();
    	SSLconnect("google.com", 443);
    
    	char GET[] = "GET / HTTP/1.0\r\nHost: forum.antichat.ru\r\n\r\n";
    	char buf[2046] = "";
    
    	cout << SSL_write(ssl, GET, sizeof(GET)) << "\r\n";
    	int err = GetLastError();
    	cout << SSL_read(ssl, buf, 2046) << "\r\n";
    	err = GetLastError();
    	cout << buf << "\r\n";
    
    	getchar();
    	return 0;
    }
    
    P.S на авторство не претендую ибо это быдлокод, но все же надеюсь он будет хоть кому то полезен
     
    #1 C@T, 3 Feb 2012
    Last edited: 5 Feb 2013
    1 person likes this.