Проблема: SSL_connect() всегда не возвращает -1. Если я проверю SSL_get_error(), он вернет 5 (SSL_ERROR_SYSCALL).
Вот мой код:
Код: Выделить всё
local ffi = require("ffi")
ffi.cdef[[
typedef uint16_t sa_family_t;
typedef uint16_t in_port_t;
typedef uint32_t socklen_t;
typedef struct {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
} hostent;
typedef struct {
uint32_t s_addr;
} in_addr;
typedef struct {
sa_family_t sin_family;
in_port_t sin_port;
in_addr sin_addr;
} sockaddr_in;
typedef struct {} sockaddr;
typedef struct {} SSL_CTX;
typedef struct {} SSL;
typedef struct {} SSL_METHOD;
hostent *gethostbyname(const char *);
char *inet_ntoa(in_addr);
int socket(int, int, int);
uint16_t htons(uint16_t);
int connect(int, const sockaddr *, socklen_t);
void SSL_free(SSL *);
void SSL_CTX_free(SSL_CTX *);
int close(int);
const SSL_METHOD *TLS_method(void);
SSL_CTX *SSL_CTX_new(const SSL_METHOD *);
SSL *SSL_new(SSL_CTX *);
int SSL_set_fd(SSL *, int);
int SSL_connect(SSL *);
int SSL_write(SSL *, const void *, int);
int SSL_read(SSL *, const void *, int);
int SSL_get_error(const SSL *, int);
]]
local addr_list = ffi.cast("in_addr**", ffi.C.gethostbyname("dns.google").h_addr_list)
local AF_INET = 0x00000002
local SOCK_STREAM = 0x00000001
local sockfd = ffi.C.socket(AF_INET, SOCK_STREAM, 0);
local addr = ffi.new("sockaddr_in")
addr.sin_family = AF_INET
addr.sin_port = ffi.C.htons(443)
addr.sin_addr = addr_list[0][0]
ffi.C.connect(sockfd, ffi.cast("const sockaddr *", addr), ffi.sizeof("sockaddr_in"))
ffi.load("ssl", true)
local request = "GET /\r\n\r\n"
local buffer = ffi.new("char[?]", 1024)
local ctx = ffi.C.SSL_CTX_new(ffi.C.TLS_method())
local ssl = ffi.C.SSL_new(ctx)
ffi.C.SSL_set_fd(ssl, sockfd)
ffi.C.SSL_connect(ssl)
ffi.C.SSL_write(ssl, request, string.len(request))
ffi.C.SSL_read(ssl, buffer, 1023)
print(ffi.string(buffer))
ffi.C.SSL_free(ssl)
ffi.C.SSL_CTX_free(ctx)
ffi.C.close(sockfd)
Подробнее здесь: https://stackoverflow.com/questions/793 ... or-syscall