отправка необработанного бинарного файла с использованием tcp в erlang - PullRequest
2 голосов
/ 02 ноября 2010

У меня есть базовый клиентский сервер в erlang, который использует tcp.

Как отправить действительные двоичные данные из файла клиенту, который их запросил?

Как файл отправляется по частям?

У меня есть этот код

{ok, Socket} = gen_tcp:connect({Ip}, 2345, [binary, {packet, 4}]),

Этот {пакет, 4} обрабатывает размер данных, который отправляется в обе стороны?

Кроме того, как клиент получает данные, а затем что-то с ними делает? Как сохранить его в файл?

Спасибо

1 Ответ

8 голосов
/ 02 ноября 2010

Да - {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}.

...