【问题标题】:Timers In Network Protocols网络协议中的定时器
【发布时间】:2013-12-27 06:42:00
【问题描述】:

我正在 RedHat/C 中使用称为 SMPP 的协议构建网络应用程序,该协议在电信中用于发送 SMS。

我正在向服务器发送消息(约 70 条短信/秒),我必须等待几秒钟才能成功响应并删除消息,但如果消息超时,那么我必须将消息重新发送到服务器。

问题是如何设计一些东西来重试过期的消息?

【问题讨论】:

  • 70!你在向服务器发送垃圾邮件吗?
  • no :),这是我可以发送的最大短信数。我们使用这项服务向订阅者发送他们的电话每月账单已准备好。

标签: c linux timer network-programming


【解决方案1】:

在 SMPP 规范中有一个名为 sequence_number 的 id - 对于您发出的每个请求,这应该是单调递增的,并且从服务器返回的响应将具有它正在响应的请求的 sequence_number。

如果您稍等片刻(也许 10 秒,也许更长)并且您没有收到回复,您可以使用相同的 sequence_number 重新发送请求,如果服务器确实收到了,则应该将其识别为重复第一次;如果第一次没有收到,则将其视为新请求。

服务器也可能向您的客户端发出请求;例如这是一个交货收据,或者这是一个来自移动设备的消息——它也有它自己的序列号计数器,你应该用具有相同序列号的响应来确认它的请求。你应该跟踪你看到的序列号,这样你就可以知道你是否遇到了重复的请求。

此属性称为http://en.wikipedia.org/wiki/Idempotence,如果您正在实施电信协议,您应该熟悉它。

为了获得 70 条消息/秒,您可能需要使用滑动窗口 http://en.wikipedia.org/wiki/Flow_control_(data)#Sliding_Window 在 Idempotence 之上构建,这样您最多可以有 N(也许 10)个未完成的请求,您仍在等待响应致谢 - 除非您非常靠近 SMPP 服务器且延迟非常低。

正确执行 SMPP 并非易事,我建议您在深入实施之前从头到尾阅读 SMPP v3.4 规范。

【讨论】:

    【解决方案2】:

    您的要求不是很清楚,因此答案也可能不是很准确。

    我建议看看这在一些现有的解决方案中是如何实现的。我曾与kannel 和mbuni(这更适用于MMS)一起工作过,我建议特别看看kannel。

    Kannel 基本上是开源的 SMS 网关,并具有有效的 SMPP 支持。

    还可以查看this stackoverflow 线程,这也可能有助于理解一些想法。

    【讨论】:

    • 很抱歉,所以问题是如何设计一些东西来重试过期的消息
    猜你喜欢
    • 2012-06-03
    • 2021-06-21
    • 2013-12-14
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多