2010-11-02 3 views
2

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

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

Как файл отправляется на куски?

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

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

ли это {пакет, 4} обрабатывать объем данных, который отправить в обоих направлениях?

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

Благодаря

+2

Здесь есть много вопросов. Возможно, вам лучше разбить его на более мелкие вопросы. Вы также можете воспользоваться этим: http://20bits.com/articles/erlang-a-generalized-tcp-server/ – nmichaels

ответ

8

Да - {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} обрамления.

+0

Спасибо. Если входящие данные являются частью файла, в каком-либо конкретном порядке (торрент BITFIELD), и я пишу в файл после получения определенного буфера или кусков, как это повлияет на {пакет, someValue}? Также с файлом = gen_tcp: recv (Socket, 0) сохранит ли этот файл в памяти и может быть записан на диск при получении всего файла? – jarryd

+0

'Пакет, 4' дает вам только фреймворк. Bittorrent - это собственный протокол, который вам нужно реализовать отдельно (и поскольку bittorrent указывает что-то другое, чем '{packet, 4}' framing, вы в конечном итоге используете '{пакет, raw}'). Вы можете посмотреть пример использования erlang для примеров того, как это сделать - попробуйте http://github.com/jlouis/etorrent/tree/ – archaelus

Смежные вопросы