我通过这种方式建立了与客户的联系:
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,硬件?
感谢。
答案 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并从缓冲区中删除完整消息,然后继续。
如果您向我们提供有关客户端和正在使用的协议的一些信息,我们可能会帮助您。