socketwith中的HTTPS请求以及C中的代理(HTTPS、socks4、socks5)

socketwith中的HTTPS请求以及C中的代理(HTTPS、socks4、socks5),c,ssl,https,proxy,openssl,C,Ssl,Https,Proxy,Openssl,我开发了一个程序,在多线程中发出HTTPS请求。 所有的工作都很好,但是我需要实现代理的使用 目前,我有一个HTTPS请求功能: struct string_builder* webrequest(const char* DEST_IP, const int DEST_PORT, const char* REQUEST) { // Initialize ssl libraries and error messages SSL_CTX *ssl_ctx = SSL_CTX_new (

我开发了一个程序,在多线程中发出HTTPS请求。 所有的工作都很好,但是我需要实现代理的使用

目前,我有一个HTTPS请求功能:

  struct string_builder* webrequest(const char* DEST_IP, const int DEST_PORT, const char* REQUEST) {
  // Initialize ssl libraries and error messages

  SSL_CTX *ssl_ctx = SSL_CTX_new (SSLv23_client_method());
  // create a socket
  int sockfd = socket(PF_INET, SOCK_STREAM, 0);
  if (sockfd == -1) {
    perror("Unable to create socket");
    return NULL;
  }
  // destination info
  struct sockaddr_in dest_addr;
  dest_addr.sin_family = AF_INET;       // host byte order
  dest_addr.sin_port = htons(DEST_PORT);    // short, network port
  dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); // destination address
  memset(&(dest_addr.sin_zero), '\0', 8);         // zero out the rest of the struct

  // connect to the server
  int status = connect(sockfd, (struct sockaddr*) &dest_addr, sizeof(struct sockaddr_in));
  if (status == -1) {
    perror("Unable to connect to the server");
    close(sockfd);
    return NULL;
  }
  // create SSL connection and attach it to the socket
  SSL *conn = SSL_new(ssl_ctx);
  SSL_set_fd(conn, sockfd);
  SSL_connect(conn);

  // send an encrypted message
  ssize_t sendsize = SSL_write(conn, REQUEST, strlen(REQUEST));
  if (sendsize == -1) {
    perror("Unable to send to the server");
    {
      char *buf = malloc(sizeof(char) * 256);;
      u_long err;

      while ((err = ERR_get_error()) != 0) {
        ERR_error_string_n(err, buf, sizeof(buf));
        printf("*** %s\n", buf);
      }
      free(buf);
    }
    SSL_shutdown(conn);
    ERR_free_strings();
    ERR_remove_state(0);
    SSL_CTX_free(ssl_ctx);
    close(sockfd);
    return NULL;
  }
  size_t i = 1;
  struct string_builder *result = NULL;
  result = string_builder_init();
  while (i) {
    // receive the response
    const int RESPONSE_SIZE = 512;
    char *response = malloc(sizeof(char)*512);
    ssize_t recsize = SSL_read(conn, response, RESPONSE_SIZE-1);
    if (recsize == -1) {
      perror("Unable to send to the server");
      SSL_shutdown(conn);
      ERR_free_strings();
      ERR_remove_state(0);
      SSL_CTX_free(ssl_ctx);
      close(sockfd);
      return NULL;
    }
    response[recsize] = '\0';
    if (recsize <= 0)
    {
      free(response);
      break;
    }
    else if (i > 2 && recsize > 6)
    {
      string_builder_pushs(result, response);
    }
    free(response);
    ++i;
  }
  // close ssl connection
    SSL_shutdown(conn);
    ERR_free_strings();
    ERR_remove_state(0);
    SSL_free(conn);  
    SSL_CTX_free(ssl_ctx);
  close(sockfd);
  return result;
}
struct string\u builder*webrequest(const char*DEST\u IP、const int DEST\u PORT、const char*REQUEST){
//初始化ssl库和错误消息
SSL_CTX*SSL_CTX=SSL_CTX_new(SSLv23_client_method());
//创建一个套接字
int sockfd=套接字(PF_INET,SOCK_STREAM,0);
如果(sockfd==-1){
perror(“无法创建套接字”);
返回NULL;
}
//目的地信息
dest\u addr中的结构sockaddr\u;
dest\u addr.sin\u family=AF\u INET;//主机字节顺序
dest_addr.sin_port=htons(dest_port);//短,网络端口
dest_addr.sin_addr.s_addr=inet_addr(dest_IP);//目标地址
memset(&(dest_addr.sin_zero),'\0',8);//将结构的其余部分归零
//连接到服务器
int status=connect(sockfd,(struct sockaddr*)和dest_addr,sizeof(struct sockaddr_in));
如果(状态==-1){
perror(“无法连接到服务器”);
关闭(sockfd);
返回NULL;
}
//创建SSL连接并将其连接到套接字
SSL*conn=SSL\u new(SSL\u ctx);
SSL设置fd(连接,插座fd);
SSL_连接(连接);
//发送加密消息
ssize_t sendsize=SSL_write(连接、请求、strlen(请求));
如果(sendsize==-1){
perror(“无法发送到服务器”);
{
char*buf=malloc(sizeof(char)*256);;
你错了很久;
而((err=err\u get\u error())!=0){
ERR_error_string_n(ERR,buf,sizeof(buf));
printf(“***%s\n”,buf);
}
免费(buf);
}
SSL_关闭(连接);
ERR_free_strings();
错误删除状态(0);
SSL_-CTX_-free(SSL_-CTX);
关闭(sockfd);
返回NULL;
}
尺寸i=1;
结构字符串构建器*result=NULL;
结果=string_builder_init();
而(i){
//收到回复
const int RESPONSE_SIZE=512;
char*response=malloc(sizeof(char)*512);
ssize_t recsize=SSL_read(连接、响应、响应大小-1);
如果(recsize==-1){
perror(“无法发送到服务器”);
SSL_关闭(连接);
ERR_free_strings();
错误删除状态(0);
SSL_-CTX_-free(SSL_-CTX);
关闭(sockfd);
返回NULL;
}
响应[recsize]='\0';
如果(recsize 2&&recsize>6)
{
字符串生成器推送(结果、响应);
}
自由(反应);
++一,;
}
//关闭ssl连接
SSL_关闭(连接);
ERR_free_strings();
错误删除状态(0);
无SSL_(康涅狄格州);
SSL_-CTX_-free(SSL_-CTX);
关闭(sockfd);
返回结果;
}
我对套接字使用socket/send/recv函数,对HTTPS请求使用openssl库。 所有这些都可以正常工作,没有代理的情况下没有泄漏,但当我尝试使用“连接命令”连接到google(以及socket connexion到代理主机)时,我在发送时出错


提前感谢。

“…当我尝试使用“连接命令”连接到google(以及socket connexion到代理主机)时,我想发送时出错”-错误是什么?你也应该把事情简化成一个简单的问题。我怀疑是否有人能够运行代码来帮助您。最后,禁用SSLv3,使用TLS1.0(或更高版本)和SNI。另请参见OpenSSL wiki。您好,感谢您的回复/e!我可以把我所有的代码,但它大约800行,我可以给一个tar.gz或zip如果你想。对于CONNECT命令的错误,错误如下:ssize_t sendsize=SSL_write(conn,REQUEST,strlen(REQUEST));=>sendsize返回-1。我的第一个解决方案是将socket更改为curl库,但我程序的目标是“速度”,这就是为什么我尝试使用最多的系统调用和本机函数。谢谢你的帮助。