Да - {packet, 4}
приведет к тому, что erlang потребует пакетный кадр с 4-байтовым беззнаковым целым значением длины с прямым порядком байтов при получении и выдаст один перед каждым пакетом данных.
Вы можете отправлять данные в сокет, вызывая gen_tcp:send(Socket, Data)
. Это будет делать что-то вроде:
RawData = iolist_to_binary(Data),
Length = byte_size(RawData),
Packet = <<Length:32/big-unsigned-integer, RawData/binary>>,
send(Socket, Packet).
Итак, если ваш файл меньше 4 ГБ, вы можете отправить его, выполнив
{ok, File} = file:read_file(FileName),
gen_tcp:send(Socket, File).
На приемном конце:
File = gen_tcp:recv(Socket, 0).
Вы получите полный файл благодаря кадрам {packet, 4}
.