我正在尝试使用 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 库“这个数据包已经完成,现在就发送”?