2014-01-15 77 views
1

我不确定这是否是正确的地方要问,所以请原谅我,如果不是。TCP作为连接协议问题

我正在写计算机监控软件,需要连接到服务器。服务器可能会发出相对紧急的消息,如声音或取消警报,客户端可能会发送有关计算机的数据,如屏幕截图。客户发送的数据在时间上并不太重要,但迟迟不会超过两分钟。

对于软件来说,不需要设置端口转发是非常重要的,并且假设互联网连接将通过几乎所有时间都具有NAT的无线路由器完成。

我的想法是从客户端启动TCP连接,并使用它来传输数据。理想情况下,我不会在没有需要时发送数据,但我相信这是不可能的。现在每隔一段时间发送一次ping就会保持连接活跃,如果此程序一直在计算机上运行,​​它将使用何种带宽?另外,是否有可能减少这些保活标题的大小?

在我开始设计通信和编程之前,这个连接计划是否有缺陷?有更好的选择吗?

谢谢!

回答

2

1)您不需要发送'ping'数据来保持连接处于活动状态,TCP堆栈会自动执行此操作;发送“ping”数据的一个原因是要检测客户端的连接关闭 - 通常只有在尝试从套接字读取/写入时才发现有问题。可能有更改各种超时的方法,以便您可以更快地检测到这种情况。

2)一般来说,虽然TCP提供了一个面向流的无错信道,但它并不保证时效性,如果你在互联网上使用它,它将变得更加难以预测。 3)对于这样的应用程序(我希望你是出于道德目的) - 我会倾向于使用TCP,因为你不想要一个客户端收到一个数据包来提高警报但不知道的情况那个再次关闭它的人。

+3

除非您通过在套接字上启用保持连接来告知TCP堆栈,否则TCP堆栈不会自动发送ping。它默认是禁用的。 – EJP

+0

不要担心,所有的透明和道德(将在GPL下发布)。如果我正确理解了第一部分,我可以打开一个连接,离开它几个小时,然后应该做些紧急的事情 - 比如警报 - 它可以立即访问? – Jacob

+0

由于EJP指出您需要启用启用保持活动;是的,您可以连接并保持频道打开,并在需要时发送数据,但是,如果在发送连接之前该发生什么情况,该怎么办?最好的情况是消息会通过网络上的可用延迟传递到另一端 - 最糟糕的情况是,延迟时间延长,延迟时间延长,超时,需要重新连接,或者另一端下降,你将不得不做出几次尝试,我会倾向于采取平均情况,但最好记住最坏的情况。 – wmercer