1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
let ic _ =
let length_current = ref 16777215 in
let length = ref 0 in
let number = ref 0 in
let acc_bits = ref Bitstring.empty_bitstring in
let f () =
let bits = Bitstring.bitstring_of_chan_max ic 4 in
match%bitstring bits with
| {| packet_length : 3*8 : int, unsigned, littleendian;
packet_number : 1*8 : int, unsigned, bigendian |} ->
let bits = Bitstring.bitstring_of_chan_max ic packet_length in
let () = length_current := packet_length in
let () = length := !length + packet_length in
let () = number := packet_number in
let () = acc_bits := Bitstring.concat [! acc_bits; bits] in
()
in
try
let () =
while (!length_current = 16777215) do
f ();
done
in
(! length, ! number, ! acc_bits)
with
| _ -> (! length, ! number, ! acc_bits)
let ic oc =
let bits = Bitstring.bitstring_of_chan_max ic 4 in
match%bitstring bits with
| {| packet_length : 3*8 : int, unsigned, littleendian;
packet_number : 1*8 : int, unsigned, bigendian |} ->
let () =
if (packet_length > Sys.max_string_length) then
failwith "Packet length > max_string_length"
in
let bits = Bitstring.bitstring_of_chan_max ic packet_length in
if (packet_length >= 16777215) then
let (, , ) = extract_extra_packets ic oc in
(packet_length + packet_length_extra, packet_number_extra, Bitstring.concat [bits; bits_extra])
else
(packet_length, packet_number, bits)
let make_packet current_num_packet bits =
let num = current_num_packet + 1 in
let length = Bitstring.bitstring_length bits / 8 in
let bits_length =
if (length <= 16777215) then (
let%bitstring v =
{|
length : 3*8 : int, unsigned, littleendian
|}
in v
)
else (
failwith "Send packet length too big ( > 0xffffff )"
)
in
let%bitstring packet = {|
bits_length : Bitstring.bitstring_length bits_length : bitstring;
num : 1*8 : int, unsigned, bigendian;
bits : Bitstring.bitstring_length bits : bitstring
|}
in
packet