网络协议中的计时器

时间:2013-12-09 23:08:37

标签: c linux timer network-programming

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

我正处于向服务器发送消息(约70条SMS /秒)的地方,我必须等待几秒钟才能成功响应并删除消息,但如果消息超时则我必须将消息重新发送到服务器。

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

2 个答案:

答案 0 :(得分:2)

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

如果您等待一段时间(可能是10秒,可能更长)并且您没有得到回复,您可以使用相同的sequence_number重新发送请求,如果确实接收到服务器,则应将其视为重复这是第一次;如果它没有第一次收到,那么它会将其视为新的请求。

服务器也可以向您的客户提出请求;例如这是一个交付收据或这里是一个移动发起的消息 - 它也有自己的sequence_number计数器,你应该确认它的请求与具有相同序列号的响应。您应该跟踪您看到的序列号,以便判断您是否遇到重复请求。

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

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

正确地执行SMPP并不是一件容易的事情我建议您在进入实现之前先阅读SMPP v3.4规范。

答案 1 :(得分:0)

目前还不是很清楚你要求的是什么,所以答案也可能不太精确。

我建议看一下现有解决方案是如何实现的。我已经与kannel和mbuni(这相当于MMS)进行了一些工作,我建议特别看看kannel。

Kannel基本上是开源短信网关,并且支持SMPP。

另请参阅this stackoverflow线程,这可能也有助于理解一些想法。