Anonymous
Ошибка LuaJIT FFI: SSL_connect: SSL_ERROR_SYSCALL
Сообщение
Anonymous » 12 янв 2025, 23:34
Я использую библиотеку 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
1736714079
Anonymous
Я использую библиотеку ffi из luajit, чтобы выполнить HTTPS-запрос barebonds в lua. Проблема: SSL_connect() всегда не возвращает -1. Если я проверю SSL_get_error(), он вернет 5 (SSL_ERROR_SYSCALL). Вот мой код: [code]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) [/code] Код основан на коде C из этого видео. Я попробовал это в C, и оно работает безупречно, поэтому это не должно быть ошибкой моей версии libssl Подробнее здесь: [url]https://stackoverflow.com/questions/79350679/luajit-ffi-error-ssl-connect-ssl-error-syscall[/url]