Моя проблема;
Я попытался использовать несколько адресов хоста для подключения к серверу через встроенную систему.
К сожалению, я обнаружил ошибку подключения.
Экземпляр, я могу подключиться к "www.google.com", но не могу подключиться к "www.wikipedia.org."
Функция res = SSL_connect(ssl)
возвращает значение -1.
I получить "неизвестный код ошибки", когда я вызываю функцию для result = ERR_error_string(err, buf);
.
int rl_ssl_fetch_webpage(void)
{
long res = 1;
int ret = 1;
unsigned long ssl_err = 0;
int sockfd = 0;
SSL *ssl = NULL;
SSL_CTX *ctx = NULL;
init_openssl();
do{
const SSL_METHOD *method = SSLv23_client_method();
ssl_err = ERR_get_error();
if(method == NULL){
error_msg(ssl_err, "SSLv23_client_method");
break;
}
ctx = SSL_CTX_new(method);
ssl_err = ERR_get_error();
if(ctx == NULL){
error_msg(ssl_err, "SSL_CTX_new");
break;
}
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
ssl = SSL_new(ctx);
ssl_err = ERR_get_error();
if(ssl == NULL){
error_msg(ssl_err, "SSL_new");
break;
}
sockfd = conn_socket();
res = SSL_set_fd(ssl, sockfd);
ssl_err = ERR_get_error();
if(res != 1){
error_msg(ssl_err, "SSL_set_fd");
break;
}
res = SSL_connect(ssl);
ssl_err = ERR_get_error();
if(res != 1){
ssl_err = ERR_get_error();
error_msg(res, "SSL_connect");
break;
}..........
static int conn_socket(void)
{
int res, sockfd;
struct addrinfo hints = {}, *srvaddrs;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
if((res = getaddrinfo(HOST_NAME, HOST_PORT, &hints, &srvaddrs)) != 0){
perror("ERROR: getaddrinfo()\n");
exit(EXIT_FAILURE);
}
if((sockfd = socket(srvaddrs->ai_family, srvaddrs->ai_socktype, srvaddrs->ai_protocol)) < 0){
perror("ERROR: socket()\n");
exit(EXIT_FAILURE);
}
struct timeval timeout;
timeout.tv_sec = 2; //seconds
timeout.tv_usec = 0; //microseconds
socklen_t opt_len = sizeof(timeout);
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (void *) &timeout, opt_len);
if(connect(sockfd, srvaddrs->ai_addr, srvaddrs->ai_addrlen) != 0){
close(sockfd);
perror("ERROR: connect()\n");
exit(EXIT_FAILURE);
}
freeaddrinfo(srvaddrs);
return sockfd;
}
заголовочный файл
#ifndef __RL_OPENSSL_H__
#define __RL_OPENSSL_H__
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#define HOST_NAME "www.wikipedia.org" //non-working
//#define HOST_NAME "www.google.com" //working
#define HOST_PORT "443"
#define HOST_RESOURCE "/ "
#endif
Спасибо за вашу помощь.