jeremyczhen / fdbus

FDBus - Fast Distributed Bus
https://blog.csdn.net/jeremy_cz/article/details/89060291
161 stars 85 forks source link

Audio长时间通信、传输数据时,ConnectorClient:CBaseClient会异常onOffline并很快重新onOnline #15

Open rgu510 opened 4 years ago

rgu510 commented 4 years ago

在两个系统host1、host2上分别建立了用于Audio连接的server/client。 host1:用于连接的ConnectorServer:CBaseServer; 用于数据传输的AudioClient:CFdbBaseObject;(通过Invoke( )函数发送数据) Host Server

host2:用于连接的ConnectorClient:CBaseClient; 用于数据传输的AudioClient:CFdbBaseObject;(通过onInvoke( )函数接收数据)

在长时间使用上述通道进行Audio数据传输时, 偶现host2上ConnectorClient::onOffline( ),然后很快又ConnectorClient::onOnline( ),

在出现问题时,host2上的其他fdbus module并没有onOffline、onOnline,只有Audio出现了此问题。

所以请问,出现这个问题可能的原因是什么? 有没有可能是host1发送的Audio数据过大,拥堵住了fdbus buffer? 又或者是host2上onInvoke( )函数内发生了block行为,上一次的onInvoke( )一直未正常return?

rgu510 commented 4 years ago

通过logsvc获取log后,观察到如下异常log: [D][E][FDBUS-3287-localhost][6260236] CFdbSession: Session 1: Unable to read message: 741! [D][E][FDBUS-3287-localhost][6260590] CClientSocket: shutdown due to IO error but reconnected to cns3.android.audio@tcp://192.168.2.1:60002. 这是什么原因?socket挂了?

jeremyczhen commented 3 years ago

从版本c3346545开始,把socket的send和recv标志位MSG_DONTWAIT去掉了,从而确保消息可靠收发。这样做的代价是socket收发可能会block,一个socket出问题会造成进程里所有的client/server都不能正常工作。