IronsDu / brynet

A Header-Only cross-platform C++ TCP network library . We can use vcpkg(https://github.com/Microsoft/vcpkg/tree/master/ports/brynet) install brynet.
MIT License
1.05k stars 241 forks source link

请问在TCP连接中, 如果服务端突然断网了, 客户端怎么收到断开通知呢?setDisConnectCallback的回调里不会收到通知 #97

Closed tonyonce2017 closed 3 years ago

IronsDu commented 3 years ago

设置心跳哦。

IronsDu commented 3 years ago

以及设置链接超时时间都行。

tonyonce2017 commented 3 years ago

以及设置链接超时时间都行。

wrapper::ConnectionBuilder初始化时设置WithTimeout的时间吗, 我设置的10秒, 等了10多分钟才收到断开的消息 image 请问在哪个接口设置呢

IronsDu commented 3 years ago

是连接已经成功?那就不是ConnectionBuilder的WithTimeout (这是设置链接的超时时间)。 对于已经连接成功后的链接设置心跳时间,是在(通过AddEnterCallback设置)连接成功的回调里采用:TcpConnection ::setHeartBeat 来设置。

tonyonce2017 commented 3 years ago

是连接已经成功?那就不是ConnectionBuilder的WithTimeout (这是设置链接的超时时间)。 对于已经连接成功后的链接设置心跳时间,是在(通过AddEnterCallback设置)连接成功的回调里采用:TcpConnection ::setHeartBeat 来设置。

我设置heartbeat为10秒, 发现连接40秒的时候就会断开, 设置的时间越短, 断开的越快, 不设置的话就不会断开, 断开是因为服务端没有响应心跳包吗

IronsDu commented 3 years ago

是连接已经成功?那就不是ConnectionBuilder的WithTimeout (这是设置链接的超时时间)。 对于已经连接成功后的链接设置心跳时间,是在(通过AddEnterCallback设置)连接成功的回调里采用:TcpConnection ::setHeartBeat 来设置。

我设置heartbeat为10秒, 发现连接40秒的时候就会断开, 设置的时间越短, 断开的越快, 不设置的话就不会断开, 断开是因为服务端没有响应心跳包吗

  1. (若没有设置心跳)之所以很久才能收到断开,因为突然断网了,会导致FIN无法发送给你,所以不知道对方已经断网了。
  2. brynet里设置heartbeat仅仅是设置心跳检测(即检查距离上一次收到数据的时间),但并不会帮助你去发送心跳包。 (心跳包需要你自己构造,且自己发送)。
tonyonce2017 commented 3 years ago

是连接已经成功?那就不是ConnectionBuilder的WithTimeout (这是设置链接的超时时间)。 对于已经连接成功后的链接设置心跳时间,是在(通过AddEnterCallback设置)连接成功的回调里采用:TcpConnection ::setHeartBeat 来设置。

我设置heartbeat为10秒, 发现连接40秒的时候就会断开, 设置的时间越短, 断开的越快, 不设置的话就不会断开, 断开是因为服务端没有响应心跳包吗

  1. (若没有设置心跳)之所以很久才能收到断开,因为突然断网了,会导致FIN无法发送给你,所以不知道对方已经断网了。
  2. brynet里设置heartbeat仅仅是设置心跳检测(即检查距离上一次收到数据的时间),但并不会帮助你去发送心跳包。 (心跳包需要你自己构造,且自己发送)。

好的, 了解了, 谢谢