Ошибка LuaJIT FFI: SSL_connect: SSL_ERROR_SYSCALLLinux

Ответить
Anonymous
 Ошибка LuaJIT FFI: SSL_connect: SSL_ERROR_SYSCALL

Сообщение Anonymous »

Я использую библиотеку ffi из luajit, чтобы выполнить HTTPS-запрос barebonds в lua.
Проблема: 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)
Код основан на коде C из этого видео. Я попробовал это в C, и оно работает безупречно, поэтому это не должно быть ошибкой моей версии libssl


Подробнее здесь: https://stackoverflow.com/questions/793 ... or-syscall
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»