ограничение приемного буфера - PullRequest
3 голосов
/ 25 января 2011

Я установил соединение с клиентом следующим образом:

gen_tcp:listen(1234,[binary,{packet,0},{reuseaddr,true},{active,false},{recbuf,2048}]).

Этот код выполняет обработку сообщений:

loop(Socket)->
    inet:setops(Socket,[{active,once}],
    receive
        {tcp,Socket,Data}->
            handle(Data),
            loop(Socket);
        {Pid,Cmd}->
            gen_tcp:send(Socket,Cmd),
            loop(Socket);
        {tcp_close,Socket}->
            % ...
end.

Моя ОС - Windows.Когда размер сообщения составляет 1024 байта, я теряю байты в Data.Сервер отправляет ACK + FIN клиенту.

Я считаю, что Erlang ограничен 1024 байтами, поэтому я определил recbuf.

Где проблема: Erlang, Windows, аппаратное обеспечение?

Спасибо.

1 Ответ

2 голосов
/ 19 февраля 2011

Возможно, вы устанавливаете приемный буфер слишком маленьким. Erlang, конечно, не ограничен буфером в 1024 байта. Вы можете проверить сами, выполнив в командной строке следующее:

{ok, S} = gen_tcp:connect("www.google.com", 80, [{active,false}]),
O = inet:getopts(S, [recbuf]),
gen_tcp:close(S),
O.

В Mac OS X размер буфера приема по умолчанию составляет около 512 КБ.


С парсингом {packet, 0} вы получите tcp-данные в любых блоках, которые сетевой стек выберет для отправки, поэтому вам придется самостоятельно выполнять синтаксический анализ и буферизацию границ сообщения. У вас есть надежный способ проверить границы сообщений в проводном протоколе? Если это так, получите данные tcp и добавьте их в буферную переменную, пока не получите полное сообщение. Затем вызовите описатель полного сообщения и удалите полное сообщение из буфера, прежде чем продолжить.

Мы могли бы помочь вам больше, если бы вы дали нам некоторую информацию о клиенте и используемом протоколе.

...