gpt4 book ai didi

cocoa - Asyncsockets 和 "silent"断开连接

转载 作者:行者123 更新时间:2023-12-03 16:59:34 26 4
gpt4 key购买 nike

我一直使用 cocoaasyncsocket 作为使用 asyncsocket 的 Windows .net 服务器的客户端。我正在使用 ProtocolBuffers 编码消息。这些共同构成了一套很棒的工具。

但是最近我注意到,如果我让客户端长时间连接到服务器(几个小时),当我尝试发出数据请求时,消息似乎已发送,但从未到达服务器。我将其称为“无提示”断开连接,因为我没有收到通常出现网络问题时会出现的断开连接消息。

我正在努力调试以下方法,但没有一个被调用:

- (NSTimeInterval)onSocket:(AsyncSocket *)sock
shouldTimeoutReadWithTag:(long)tag
elapsed:(NSTimeInterval)elapsed
bytesDone:(CFIndex)length {

- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err

- (void)onSocketDidDisconnect:(AsyncSocket *)sock

在没有任何通知的情况下,我发现这很难调试。服务器同样不会显示任何断开连接。

有人能指出我如何进一步分析这个问题的方向吗?

非常感谢。

最佳答案

如果您想知道您的客户端和服务器已连接,则必须有一个心跳或“保持连接”,即交换的应用程序级消息,基本上表示“您在吗”/"is"。

现在尤其如此,因为许多路由器会默默地丢弃空闲的 TCP 连接。这不是 TCP 的设计目的,但这是生活的事实。

TCP 可以选择使用 SO_KEEPALIVE 发送连接层心跳或保持事件,但历史上对于这是否合适存在争议。设计人员认为,由于临时的中间网络问题而丢弃套接字是错误的。如果在此期间实际上没有发送数据,则没有理由断开连接。其他人则认为了解连接是否良好本身就很重要。如果您期待数据但数据尚未到达怎么办?你不想知道吗?

最终这取决于应用程序。如果“没有新信息”是对您的应用程序很重要的事实断言(例如新闻源、销售订单、市场数据价格变化),您需要检查“没有新信息”是否是真正的“没有新信息” ”而不是“连接默默地断开”。这意味着一条明确的消息。

那么您应该多久发送一次?

这取决于事物的平衡。 1a) 您通常多久获取一次更新? 1b) 什么延迟是可接受/正常的(例如,如果这是流程的一部分,其他步骤通常需要几个小时,那么 5-10 分钟可能是可以接受的)。 2a) 电池和 2b) 由于心跳导致的数据使用量。我怀疑对电池/功率的影响至关重要,但所有这些都需要仔细考虑和平衡。

毕竟你可能随时失去覆盖范围(隧道等)。仅当您在平均更新间隔的 0.5 到 5 倍之间没有更新时,我才会运行心跳。因此,如果您期望每分钟 2 次更新,请在空闲 15 秒到 3 分钟时运行心跳 - 判断什么是最好的。如果用户在应用程序中“运行”并在完成后“将其关闭”,那么电池生命周期就不是问题,因为他们无论如何都在使用它。如果您唤醒设备来处理更新,电池生命周期确实是一个问题。

关于cocoa - Asyncsockets 和 "silent"断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5338352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com