代码之家  ›  专栏  ›  技术社区  ›  free2use

Golang tcp套接字读取最终给出EOF

  •  2
  • free2use  · 技术社区  · 10 年前

    我无法从套接字读取数据。有一个星号实例运行着大量的调用(一分钟10-60),我正在尝试读取和处理与这些调用相关的CDR事件(连接到AMI)。

    这是我正在使用的库(不是我的,但因为bug被推到了fork) https://github.com/warik/gami

    它非常简单,主要动作是gami.go-readDispatcher。

    buf := make([]byte, _READ_BUF)    // read buffer
        for {
            rc, err := (*a.conn).Read(buf)
    

    所以,有TCPConn(a.conn)和大小为1024的缓冲区,我正在从套接字读取消息。到目前为止还不错,但最终会不时出现(这个时间可能从10分钟到5小时不等,与通过套接字传输的数据量无关)读取操作失败,并出现io.EOF错误。我试图重新连接并立即重新登录,但这也是不可能的-连接超时,所以我被迫等待大约40-60秒,这一次对我来说非常重要,因为延迟,我丢失了大量数据。我在谷歌上搜索,阅读资料,尝试了很多东西——什么都没有。最奇怪的是,在python或php中打开的简单套接字不会失败。

    • 这是否可能是因为缺少文件描述符来表示矿机或星号服务器上的套接字?
    • 星号配置中有可能出现这个问题吗(因为我有另一个星号,这个问题不会再次出现,而且,我对最后一个星号的调用时间更短)?
    • 在我处理套接字连接或一般使用Go时,是否可能出现这种问题?

    go版本go1.2.1 linux/amd64

    星号1.8

    2 回复  |  直到 10 年前
        1
  •  1
  •   arheops    10 年前

    更新至最新星号。当AMI发送大量数据时,存在这样的错误。

    对于检查问题,您可以通过类似“command sip show peers”(或任何其他长输出命令)的ami命令发送并查看结果。

        2
  •  1
  •   free2use    10 年前

    好的,问题出在OS套接字缓冲区溢出。似乎有太多数据需要处理。

    因此,有三种可能的解决方法:

    • 增加套接字缓冲区容量
    • 以某种方式提高从套接字读取数据的处理速度
    • 较低的数据量或频率

    gami默认读取星号中的所有数据。我正在读取所有这些文件,并在实际读取操作后过滤它们。根据AMI侦听应用程序在相当差的PC上运行的说法,它似乎无法在缓冲区容量暴露之前读取所有数据。但通过向AMI发送“事件”操作并指定所需的“事件掩码”,可以仅接收特定事件。 所以,我决定这么做。并为不同的事件类型创建不同的连接。