0

我正在使用logica smpp lib编写ESME,但有一个严重的问题 - 当 SMSC 发送到 ESME [FIN, ACK]时,ESME 没有正确回答。

这里 TCP 转储:

2751.016216 ESME -> SMSC         SMPP SMPP Submit_sm 
2751.019818         SMSC -> ESME SMPP SMPP Submit_sm - resp: "Throttling error (ESME exceeded allowed message limits)" 
2751.136172 ESME -> SMSC         TCP 42265 > 5001 [ACK] Seq=1651885221 Ack=3959508692 Win=123 Len=0 
2774.588453         SMSC -> ESME TCP 5001 > 42265 [FIN, ACK] Seq=3959508692 Ack=1651885221 Win=32768 Len=0 
2774.741502 ESME -> SMSC         TCP 42265 > 5001 [ACK] Seq=1651885221 Ack=3959508693 Win=123 Len=0 
2821.032427 ESME -> SMSC         SMPP SMPP Submit_sm 
2821.033502         SMSC -> ESME TCP 5001 > 42265 [RST] Seq=3959508693 Ack=0 Win=32768 Len=22 

如何解决这个问题?可以处理这个数据包吗?

4

2 回答 2

0

在 class TCPIPConnection, method -public ByteBuffer receive()你应该这样做:

                    bytesRead = inputStream.read(receiveBuffer, 0, bytesToRead);
                    if (bytesRead == -1){
                        //close connection here
                    }
于 2012-03-28T06:32:14.317 回答
0

使用像Logica lib这样的框架/库的重点应该是将您与低级API / TCP FIN级细节隔离开来,否则使用该框架没有任何附加值。我们经历过这条路线,除非你有才华横溢的 TCP 程序员,否则这条 TCP 级别的工作路线不会有成效。

多年来,我已经看到开源 SMPP lib Cloudhopper(由 Twitter 制作,后来开源)在非常大的平台中使用。它在许多领先的电信公司中都很强大并且经过生产验证。它具有可用于自定义的示例客户端。连接管理:第一次有 SMPP 连接时缓存连接(每个会话)。在执行 submitSM PDU(发送 SMS)时,检查异常的类型,它是连接异常,只需重新绑定并重新连接 SMPP 会话/连接。如果您有很长一段时间不活动(例如超过 40 秒),则其端的 SMPP 服务器/SMSC 可能会丢弃连接。要重新连接,您有两个选择:a) 在下次执行 submitSM PDU 时检测陈旧连接,重新连接,更新缓存,然后发送 submitSm PDU 或 b) 这是首选选项。有一个单独的线程定期执行 enquireLink PDU - 比如说每 45 秒,这将确保连接保持活动状态。假设 enquireLink 和 submitSM PDU 使用相同的缓存 SMPP 会话/连接。当然,如果 enquireLink PDU 检测到断开的连接,它应该重新绑定并更新通用 SMPP 会话/连接。多年来,我已经看到这种方法在多个应用程序中运行良好。

于 2015-07-31T11:02:05.693 回答