2012-07-30 69 views
0

我必须实现一个应用程序,它在很短的时间内每隔几秒向服务器发送一次数据包,当服务器收到它时,它会向客户端发送一个响应,然后才会发送另一个数据包。这听起来很不错,但是我们使用的是TCP,服务器收到数据包后就立即响应,而不是后处理或类似的东西。所以这让我想知道,你为什么要这样做?客户端有一个队列,我不停的所有数据包,并做了这样的事情:验证是否需要TCP?

try { 
    send packet // exception is thrown if connection is lost 
    remove packet from queue 
} catch exception { 
    try to reconnect 
} 

所以在这种情况下,数据包被从队列中删除仅当发送成功。

对此有何想法?这是最佳做法吗?如果有人能为我解决这个问题,我将不胜感激。

谢谢

+0

问:你的问题是什么? “开火并忘记”(而不是保持队列)会更好吗?答:很可能。使用UDP而不是TCP会更好吗(只要我们保持队列并可能管理重试)?答:很可能。检测“发送”错误(没有某种“ACK”)会有问题吗?答:是的。任何这些(潜在)问题的答案是:“这取决于”。 ;)恕我直言... – paulsm4 2012-07-30 18:48:48

+0

TCP保证运输和订购。所以对于UDP你可能会失去排序,你将不得不自己重新发送和重新排序和分片。 – 2012-07-30 18:50:40

+0

如果您只需要知道连接已启动,就会出现一个名为TCP_KEEPALIVE的选项,它会发送数据包以保持连接处于活动状态,如果它们丢失,则会将其保留。这自然不会保证软件在另一端正在工作,只是TCP连接还活着。 – 2012-07-30 18:52:33

回答

1

发送是不够的在某些情况下。如果绝对重要的是必须收到你推出门的数据,那么你应该等待确认该数据包是由远程端接收/处理的。

即使网络级别的东西完美工作并且数据包到达目的地,该目标机器仍然可能会崩溃或丢失数据。如果你删除了发送,那么这些数据就没有了。等待来自远端的确认至少会让您重新发送已损坏/丢失的数据包。

+0

您是否认为服务器可能会崩溃并且连接保持活动状态?也许如果它以某种方式被保存在一个线程中? – Bogdan 2012-07-30 18:57:14

+0

该软件可能会失败并且不会死亡。例如它可能会死锁 – 2012-07-30 18:57:55

+0

你说得很对。我从一个非常天真的角度来看待这个问题。感谢您的洞察力。 – Bogdan 2012-07-30 19:00:32

1

一种选择是将数据包放入队列并发送。发送后将它们移动到“待处理”队列中。一旦另一端有加工他们,你标记他们已完成。然后你遇到了其他问题。如果另一端处理它们,但是这种反应永远不会达到你的目的呢?这是一个相对研究的问题,如果您需要确定,我建议您研究分布式事务和两阶段提交。

+0

这是一个美妙的想法。谢谢 :) – Bogdan 2012-07-30 18:52:58