【问题标题】:erlang gen_tcp send issueerlang gen_tcp 发送问题
【发布时间】:2012-04-02 18:00:37
【问题描述】:

你能帮帮我吗?我有一个与 gen_tcp 发送功能有关的问题。我一直在尝试从我的 erlang 服务器向我的 flash 客户端发送一些元组,大约 10-15 个项目,它们被解码为 amf 对象。

case get_tcp:send(Socket, Msg) of
ok -> io:format("sent~n");
{erorr, Err} -> io:format("~w~n", [Err])
end

没有错误,但 Flash 客户端仅接收到大约 8-11 项的全部数据。套接字选项是 [binary, {active, true}, {reuseaddr, true}]。我检查了我使用客户端的网络 - 发送的数据包被分成两个片段,大的和小的。大的是数据包的第一个片段,而小的是下一个。 bigs 的数量与发送的消息数量相同,但 smalls 的数量要少得多,大约是 flash 客户端接收到的消息数量。

只有当我快速发送数据时它才会重现,如果我慢慢发送数据似乎没问题。有谁知道为什么会这样?这将非常有帮助。

【问题讨论】:

  • “我发送数据快”是什么意思?是否有可能您的缓冲内存用完了并且包被丢弃了?您确定您在另一端正确读取数据吗? wireshark 显示什么?

标签: erlang gen-tcp


【解决方案1】:
  1. 我没试过amf,但是我用erlang+flash和json代替amf
  2. socket 有什么数据包选项? (例如,我使用 {packet, 2})
  3. 您是如何在客户端读取数据的?也许您没有读取所有数据以结束并且没有引发新事件?

【讨论】:

    【解决方案2】:

    我的猜测是这是一个框架问题。

    TCP 是一种流式协议,因此当您在 flash 中读取时,不能保证立即获得所有消息。相反,您需要某种框架设置,例如套接字选项上的{packet, 2}{packet, 4}。这有效地将 TCP 从流协议转换为消息协议。我认为你想要后者。

    【讨论】:

      【解决方案3】:

      我认为你可以这样做: 1 在发送 msg(your tuple) 之前,使用 term_to_binary(Msg) 获取二进制文件,然后使用 sizeof 二进制文件,然后,在您的客户端收到 msg 后,使用 binary_to_term 获取元组。 2 客户端和服务器都需要设置socket选项{packet, 2 or 4}

      【讨论】:

        猜你喜欢
        • 2012-09-21
        • 2011-08-12
        • 2014-03-29
        • 1970-01-01
        • 2011-08-08
        • 2014-07-10
        • 2013-05-06
        • 2014-12-21
        • 2018-06-01
        相关资源
        最近更新 更多