Зависание 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 шт):

Автор решения: jokerbot

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

Только имейте ввиду, если сокет не блокирующий, то запись то же может быть прервана с ошибкой или записать только часть данных, если буфера ОС переполнены. И это то же надо отрабатывать

→ Ссылка