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

这是我正在使用的库(不是我的,但是由于错误而被迫分叉了)https://github.com/warik/gami

它非常直接,主要动作在gami.go中-readDispatcher。

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

  • 是否可能由于缺少用于在我的机器或星号服务器上表示套接字的文件描述符而导致该问题?
  • 星号配置中是否可能存在此问题(因为我在该星号上没有重现此问题,但是我在最后一个星号上的通话时间减少了)?
  • 用我的方式处理套接字连接或一般而言,使用Go可以解决这个问题吗?

go版本go1.2.1 linux / amd64

星号1.8


好的,问题出在操作系统套接字缓冲区溢出中。看起来有很多数据要处理。

因此,有三种方法可以解决此问题:

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

默认情况下,gami会从星号读取所有数据。我正在读取所有这些文件,并在实际读取操作后对其进行过滤。由于AMI侦听应用程序运行在相当差的PC上,因此它似乎无法在缓冲区容量被暴露之前就无法读取所有数据。但是,可以通过向AMI发送"事件"操作并指定所需的" EventMask"来接收特定事件"。
因此,我的决定是这样做。并为不同的事件类型创建不同的连接。


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

对于支票问题,您已通过ami命令(例如" COMMAND sip show peers")(或任何其他长输出命令)发送并查看结果。