使用bcb 调用 openssl库进行https get请求

来源:互联网 发布:女士休闲鞋新款淘宝网 编辑:程序博客网 时间:2024/06/06 01:34

1编译安装openssl

首先,下载并安装active perl(编译openssl时需要)

然后从chinaunix下载频道中下载openssl-0.9.8x.tar.gz,并解压。

打开控制台,cd切换目录到解压后所在目录,运行ms\bcb4.bat。


2配置bcb

选择菜单project-》option-》directories/conditionals

将inc32路径加入到include path中

将out32路径加入到library path中


3示例源码

#include "openssl/ssl.h"
#include "openssl/err.h"
#include "openssl/bio.h"
#include "openssl/rand.h"
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "libeay32.lib")

int getPages()
{
  const char* domain="github.com";
  const char* host_addr="192.30.252.128";
  const int host_port=443;
  const char* pObject="/mikesmullin/MenuetOS-64";

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 0), &wsaData);

    SOCKET sockfd;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        ////DebugMsg("Socket Error: %s", strerror(errno));
        return -1;
    }

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(host_port);
    server_addr.sin_addr.s_addr = inet_addr(host_addr);

    if (connect(sockfd, (struct sockaddr *) (&server_addr), sizeof(struct sockaddr)) == -1)
    {
        //DebugMsg("Connect Error:%s", strerror(errno));
        return -1;
    }

    SSL *ssl;
    SSL_CTX *ctx;
    // SSL initialize
    SSL_library_init();
    SSL_load_error_strings();
    ctx = SSL_CTX_new(SSLv23_client_method());
    if (ctx == NULL)
    {
        //DebugMsg("SSL CTX new failed!");
        return -1;
    }
    
    ssl = SSL_new(ctx);
    if (ssl == NULL)
    {
        //DebugMsg("SSL new failed!");
        return -1;
    }
    
    // link socket & SSL
    int ret = SSL_set_fd(ssl, sockfd);
    if (ret == 0)
    {
        //DebugMsg("SSL link socket failed!");
        return -1;
    }
    
    RAND_poll();
    while (RAND_status() == 0)
    {
        unsigned short rand_ret = rand() % 65536;
        RAND_seed(&rand_ret, sizeof(rand_ret));
    }
    
    // SSL connect
    ret = SSL_connect(ssl);
    if (ret != 1)
    {
        //DebugMsg("SSL connect failed!");
        return -1;
    }

    char getRequest[1024];
    char *cookie="";
    sprintf(getRequest, "GET %s HTTP/1.0\r\nHost: %s\r\nCookie: %s\r\n\r\n", pObject, domain, cookie);

    // send https request
    int totalsend = 0;
    int requestLen = strlen(getRequest);
    while (totalsend < requestLen)
    {
        int send = SSL_write(ssl, getRequest + totalsend, requestLen - totalsend);
        if (send == -1)
        {
            //DebugMsg("SSL send failed!");
        }
        totalsend += send;
        //DebugMsg("%d bytes send OK!", totalsend);
    }
    
    // receive https response
    int responseLen = 0;
    int i = 0;
    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));
    char returnBuffer[1024];
    memset(returnBuffer, 0, 1024);
//    int p = 0;
//    while ((responseLen = SSL_read(ssl, buffer, 1)) == 1 && p<1024)
//    {
//        returnBuffer[p] = buffer[0];
//        p++;
//        if (i < 4)
//        {
//            if (buffer[0] == '\r' || buffer[0] == '\n')
//                i++;
//            else
//                i = 0;
//        }
//    }

        AnsiString result;
    while ((responseLen = SSL_read(ssl, buffer, 1024))>0){
      result+=buffer;
    }
    ShowMessage(result);

    //DebugMsg("%s", returnBuffer);

    // shutdown community
    ret = SSL_shutdown(ssl);
    if (ret != 1)
    {
        //DebugMsg("SSL shutdown failed!");
        return -1;
    }
    SSL_free(ssl);
    SSL_CTX_free(ctx);
    ERR_free_strings();
    closesocket(sockfd);
    WSACleanup();
    return 0;
}

0 0
原创粉丝点击