接收缓冲区的限制

时间:2011-01-25 17:54:17

标签: sockets networking erlang otp

我通过这种方式建立了与客户的联系:

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 个答案:

答案 0 :(得分:2)

您可能将接收缓冲区设置得太小。 Erlang当然不限于1024字节缓冲区。您可以通过在shell中执行以下操作来检查自己:

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

在Mac OS X上,我得到一个约512Kb的默认接收缓冲区大小。


使用{packet, 0}解析,您将在网络堆栈选择发送它的任何块中接收tcp数据,因此您必须自己进行消息边界解析和缓冲。您是否有可靠的方法来检查有线协议中的消息边界?如果是这样,接收tcp数据并将其附加到缓冲区变量,直到您有完整的消息。然后在完成消息上调用handle并从缓冲区中删除完整消息,然后继续。

如果您向我们提供有关客户端和正在使用的协议的一些信息,我们可能会帮助您。