Networking TCP作为连接协议问题

Networking TCP作为连接协议问题,networking,tcp,Networking,Tcp,我不确定这是不是该问的地方,如果不是,请原谅 我正在编写需要连接到服务器的计算机监控软件。服务器可能会发送相对紧急的消息,如声音或取消警报,客户端可能会发送有关计算机的数据,如屏幕截图。客户端发送的数据在时间上不是很关键,但晚到的时间不应超过两分钟 对于软件来说,端口转发是必不可少的,并且假定internet连接将通过几乎始终具有NAT的无线路由器完成 我的想法是从客户端启动一个TCP连接,并使用它来传输数据。理想情况下,我不会在不需要数据时发送数据,但我认为这是不可能的。如果这个程序一直在计算

我不确定这是不是该问的地方,如果不是,请原谅

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

对于软件来说,端口转发是必不可少的,并且假定internet连接将通过几乎始终具有NAT的无线路由器完成

我的想法是从客户端启动一个TCP连接,并使用它来传输数据。理想情况下,我不会在不需要数据时发送数据,但我认为这是不可能的。如果这个程序一直在计算机上运行,那么每隔一段时间发送相当于ping的消息会使连接保持活跃吗?它会使用什么样的带宽?此外,是否有可能减少这些保持活动的标题大小

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

谢谢

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

2) 一般来说,虽然TCP提供了一个面向流的无错误通道,但它对及时性没有任何保证,如果您在internet上使用它,它甚至更不可预测


3) 对于这样的应用程序(我希望您是出于道德目的),我倾向于使用TCP,因为您不希望出现这样的情况:客户端接收到数据包时发出警报,但错过了再次关闭警报的数据包。

除非您告诉它,否则TCP堆栈不会自动发送ping,通过在套接字上启用keepalive。默认情况下它是禁用的。别担心,所有这些都是透明的和合乎道德的(并且将在GPL下发布)。如果我正确理解了第1部分,我可以打开一个连接,让它保持几个小时,然后如果需要做一些紧急的事情,比如警报,它可以立即访问吗?正如EJP指出的,您需要打开enable keep alive;是的,您可以连接并保持频道打开,并在需要时发送数据。但是,如果在发送连接之前,连接中断了怎么办?您的最佳情况是,消息将通过网络上的可用延迟到达另一端-您的最坏情况是,延迟增加,延迟增加得太厉害,您会超时并需要重新连接,或者另一端下降,您将不得不进行多次尝试,我倾向于选择一般情况,但最好记住最坏的情况。