Golang tcp socket read最终给出了EOF

时间:2014-09-15 14:55:09

标签: sockets tcp go asterisk ami

我从套接字读取时遇到问题。有一个星号实例运行大量的呼叫(一分钟10-60),我正在尝试读取和处理与这些呼叫相关的CDR事件(连接到AMI)。

这是我正在使用的库(不是我的,但因为错误而被推到了分叉)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的缓冲区,我正在从socket读取消息。到目前为止一直很好,但最终,不时(这个时间可能从10分钟变化到5个小时,与通过套接字的数据量无关)读取操作失败并出现io.EOF错误。我试图立即重新连接和重新连接,但它也不可能 - 连接超时,所以我被迫等待大约40-60秒,这次对我来说非常关键,因为延迟我丢失了大量数据。我在谷歌上搜索,阅读消息来源并尝试了很多东西 - 没什么。最奇怪的是,在python或php中打开的简单套接字不会失败。

  • 由于缺少文件描述符来代表我的机器或星号服务器上的套接字,是否可能出现此问题?
  • 是否可能是星号配置中的问题(因为我有另一个星号,此问题无法重现,但是,我在上一个问题上的时间少了)?
  • 我的方式是否有可能解决套接字连接或Go的问题?

go go go1.2.1 linux / amd64

asterisk 1.8

2 个答案:

答案 0 :(得分:1)

更新到最新的星号。当AMI发送大量数据时,有类似的错误。

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

答案 1 :(得分:1)

好的,问题在于OS套接字缓冲区溢出。如图所示,需要处理的数据很多。

那么,有三种可能的解决方法:

  • 增加套接字缓冲区容量
  • 以某种方式增加从套接字
  • 中reeds数据的进程速度
  • 较低的数据量或频率

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