我必须实现一个应用程序,它在很短的时间内每隔几秒向服务器发送一次数据包,当服务器收到它时,它会向客户端发送一个响应,然后才会发送另一个数据包。这听起来很不错,但是我们使用的是TCP,服务器收到数据包后就立即响应,而不是后处理或类似的东西。所以这让我想知道,你为什么要这样做?客户端有一个队列,我不停的所有数据包,并做了这样的事情:验证是否需要TCP?
try {
send packet // exception is thrown if connection is lost
remove packet from queue
} catch exception {
try to reconnect
}
所以在这种情况下,数据包被从队列中删除仅当发送成功。
对此有何想法?这是最佳做法吗?如果有人能为我解决这个问题,我将不胜感激。
谢谢
问:你的问题是什么? “开火并忘记”(而不是保持队列)会更好吗?答:很可能。使用UDP而不是TCP会更好吗(只要我们保持队列并可能管理重试)?答:很可能。检测“发送”错误(没有某种“ACK”)会有问题吗?答:是的。任何这些(潜在)问题的答案是:“这取决于”。 ;)恕我直言... – paulsm4 2012-07-30 18:48:48
TCP保证运输和订购。所以对于UDP你可能会失去排序,你将不得不自己重新发送和重新排序和分片。 – 2012-07-30 18:50:40
如果您只需要知道连接已启动,就会出现一个名为TCP_KEEPALIVE的选项,它会发送数据包以保持连接处于活动状态,如果它们丢失,则会将其保留。这自然不会保证软件在另一端正在工作,只是TCP连接还活着。 – 2012-07-30 18:52:33