Зависание SSL_read
У меня есть tls server на golang и tls client на с++. Я хотел реализовать так что бы клиент мог принимать большой объем данных, но когда он все принял и вызывает еще раз SSL_read, то просто зависает. Как можно избежать этого ? Вот код клиента:
SSL_write(ssl, data.c_str(), strlen(data.c_str()));
SSL_shutdown(ssl);
const int readSize = 1024;
char* rc = NULL;
int received, count = 0;
int TotalReceived = 0;
char buffer[10240];
string out;
while (1)
{
received = SSL_read(ssl, buffer, 10239);
if (received > 0)
{
buffer[received] = '\0';
TotalReceived += received;
out.append(buffer);
std::cout << TotalReceived << std::endl;
}
else
break;
}
return out;
Вот код сервера:
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("Some connection error: %s\n", err)
}
go handleConnection(conn)
}
func handleConnection(conn net.Conn) {
scanner, _ := bufio.NewReader(conn).ReadString('\f')
handleMessage(scanner, conn)
}
func handleMessage(message string, conn net.Conn) {
file, _ := os.Open("stable.dll")
defer file.Close()
stat, _ := file.Stat()
bs := make([]byte, stat.Size())
file.Read(bs)
conn.Write(bs)
}
Ответы (1 шт):
https://stackoverflow.com/questions/8411168/changing-an-openssl-bio-from-blocking-to-non-blocking-mode Тут посмотрите, основная цель сделать сокет на котором работает ssl не блокирующим (O_NONBLOCK) и корректно обрабатывать ошибку временного отсутствия данных. И там еще про пару важных флагов самого ssl говориться. Если с этим методом что то не так, то есть еще метод через установку memory BIO, самостоятельную работу с tcp сокетом и скармливанием данных на шифровку/расшифровку через BIO_read/BIO_write
Только имейте ввиду, если сокет не блокирующий, то запись то же может быть прервана с ошибкой или записать только часть данных, если буфера ОС переполнены. И это то же надо отрабатывать