2011-12-09 72 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