【问题标题】:Socket issue: How do I receive a string of more than about 3,160 characters?套接字问题:如何接收超过 3,160 个字符的字符串?
【发布时间】:2012-01-16 21:26:38
【问题描述】:

我正在尝试通过 telnet 向我的应用程序发送一个长字符串。

在我的应用程序中,我设置了一个套接字:

{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 接口来 POST 至少 4 倍大的字符串值,并且可以通过 telnet/socket 客户端获取它们...

我错过了什么?

【问题讨论】:

    标签: sockets erlang


    【解决方案1】:

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

    【讨论】:

    • 从一个活动的一次套接字开始是否合法,然后如果一行确实包含我的终结符,我很好;但如果它没有然后切换到被动模式并recv/2 我的其余数据?
    • @Jr0:是的,这是一种方法。您也可以重复{active, once}receive 循环。
    • 如果行长于接收缓冲区,将不会激活一次导致截断行?
    • 有趣...文档暗示 {packet, line} 会截断数据包,但数据 确实 似乎存在并且可以通过 gen_server 的 handle_info({tcp ... } 或多个recvs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多