Я пытаюсь реализовать протокол удаленного буфера кадров, используя библиотеку Ada Sockets, и у меня возникают проблемы с контролем длины отправляемых пакетов.
Я следую спецификации RFC 6143
(https://tools.ietf.org/pdf/rfc6143.pdf), см. комментарии в коде для номеров разделов...
-- Section 7.1.1
String'Write (Comms, Protocol_Version);
Put_Line ("Server version: '"
& Protocol_Version (1 .. 11) & "'");
String'Read (Comms, Client_Version);
Put_Line ("Client version: '"
& Client_Version (1 .. 11) & "'");
-- Section 7.1.2
-- Server sends security types
U8'Write (Comms, Number_Of_Security_Types);
U8'Write (Comms, Security_Type_None);
-- client replies by selecting a security type
U8'Read (Comms, Client_Requested_Security_Type);
Put_Line ("Client requested security type: "
& Client_Requested_Security_Type'Image);
-- Section 7.1.3
U32'Write (Comms, Byte_Reverse (Security_Result));
-- Section 7.3.1
U8'Read (Comms, Client_Requested_Shared_Flag);
Put_Line ("Client requested shared flag: "
& Client_Requested_Shared_Flag'Image);
Server_Init'Write (Comms, Server_Init_Rec);
Кажется, проблема (согласно wireshark) в том, что мои вызовы различных процедур 'Write
заставляют байты стоять в очереди в сокете без отправки.
Следовательно, два или более пакета данных отправляются как один, что приводит к искажению пакетов. Разделы 7.1.2 и 7.1.3 передаются последовательно в одном пакете, а не разбиваются на два.
Я ошибочно предположил, что 'Read
ing из сокета приведет к сбросу исходящих данных, но, похоже, это не так.
Как мне сообщить библиотеке Ada Sockets, что «этот пакет готов, отправьте его прямо сейчас»?
Client_Version
после чтения действительно равна 12? И укажите, какое значение имеетClient_Requested_Security_Type
после того, как вы прочитали его из потока? - person DeeDee   schedule 13.10.2019'Write
вызовов все идет не так. - person   schedule 13.10.2019g-socket.ads
содержит прекрасный рабочий пример того, как использовать TCP и UDP, но, к сожалению, не упоминает, что эти буферы должны поддерживаться сложным способом. Это говорит о том, чтоString'Read (stream, str_buffer)
Ады БЛОКИРУЕТСЯ, пока буфер не заполнится! - person   schedule 13.10.2019'Read
вызовы блокируются. Я не думаю, что это дублирующий вопрос, потому что я думаю, что библиотеки Ады выполняют блокировку буферизации от имени программиста.'Read
вызовы блокируются для строк фиксированной длины и для скалярных типов известной длины. - person   schedule 13.10.2019