В настоящее время я пытаюсь прочитать входящее сообщение из клиентского сокета, которое до описанной ниже процедуры уже было подключено к серверному сокету. Приведенная ниже процедура выводит сообщение по одному символу за раз, когда оно извлекает его из потока.
Проблема в том, что, когда в потоке нет информации, вызов Ada.Streams.Read
блокируется и полностью останавливает поток приложения. Согласно некоторым примерам, может показаться, что Offset
должно быть автоматически установлено на 0
в конце потока, но этого не происходит. Вместо этого приложение останавливается при звонке на Read
.
procedure Read_From (Channel : Sockets.Stream_Access) is
use Ada.Text_IO;
use Ada.Streams;
Data : Stream_Element_Array (1 .. 1);
Offset : Stream_Element_Offset;
begin
loop
Read (Channel.All, Data, Offset);
exit when Offset = 0;
Put (Character'Val (Data (1)));
end loop;
-- The application never reaches this point.
New_Line;
Put_Line ("Finished reading from client!");
end Read_From;
-- @param Channel `GNAT.Sockets.Stream (Client_Socket)`
Я также пытался выполнить тот же процесс с GNAT.Sockets.Receive_Socket
, но та же проблема остается: поток приложения полностью останавливается, ожидая получения дополнительной информации из потока, даже если больше нечего извлекать.
Любые указатели в правильном направлении будут высоко оценены!