2011-12-09 47 views
2

我想通过telnet发送一个很长的字符串到我的应用程序。套接字问题:如何接收超过3,160个字符的字符串?

在我的应用

,我设置了一个插座,带:

{ok, Sock} = gen_tcp:listen(Port, [{active, true}, {reuseaddr, true}], 
{ok, Sock} = gen_tcp:accpet(Sock), 
% start a process when someone connects 
{ok, Pid} = my_sup:start_handler(Sock), 
inet:setopts(Socket,[{active, once},{buffer, 2310731}, {recbuf, 1310731},{sndbuf, 1310731}]), 
gen_tcp:controlling_process(Socket, Pid), 

我的过程中处理该连接的客户端是一个gen_server我用的是标准

handle_info ({tcp, Sock, Data}, State) -> 

接收并处理进来的来自发件人的消息。

最初,我只能发送一个大约1,500个字符的字符串,然后我添加了setopts/2命令来增加缓冲区大小。但我无法处理超过3,160位字符的插槽。

我已通过getopts打印出值,并验证它们是在setopts/2调用中表示的值。

我可以利用我的HTTP接口发表文章的字符串值,至少4倍,并通过远程登录/插座客户端可以得到他们...

我缺少什么?

回答

0

如果您未指定packetline选项,您将只收到一个TCP数据包发送的内容。所以如果你想获得更多,你必须编写我们自己的接收环路和协议。其他数据正在缓冲区中等待,但您尚未收集它们。

+0

从一个活动的套接字开始,然后如果一行包含我的终止符是合法的,我很好;但是如果它不切换到被动模式并且recv/2我的其余数据? – Jr0

+0

@ Jr0:是的,这是一种方法。您可以重复'{active,once}','receive'循环。 –

+0

如果它们长于接收缓冲区,将不会激活一次导致截断的行吗? – Jr0