private void SendIntern(MsMessage msg) {
while(state==State.AWake || (msg!=null && (state!=State.ASleep || msg.MsgTyp==MsMessageType.DISCONNECT))) {
if(msg!=null) {
if(_gate!=null) {
if(_statistic.value) {
Stat(true, msg.MsgTyp, ((msg is MsPublish && (msg as MsPublish).Dup) || (msg is MsSubscribe && (msg as MsSubscribe).dup)));
}
try {
_gate.SendGw(this, msg);
}
catch(ArgumentOutOfRangeException ex) {
Log.Warning("{0} - {1}", this.name, ex.Message);
if(msg.IsRequest) {
lock(_sendQueue) {
if(_sendQueue.Count>0 && _sendQueue.Peek()==msg) {
_sendQueue.Dequeue();
_waitAck=false;
}
}
}
msg=null;
}
}
if(msg!=null && msg.IsRequest) {
ResetTimer(_rand.Next(ACK_TIMEOUT, ACK_TIMEOUT*5/3)/(_tryCounter+1)); // 600, 1000
_waitAck=true;
break;
}
if(_waitAck) {
break;
}
}
msg=null;
lock(_sendQueue) {
if(_sendQueue.Count==0 && state==State.AWake) {
if(_gate!=null) {
_gate.SendGw(this, new MsMessage(MsMessageType.PINGRESP));
if(_statistic.value) {
Stat(true, MsMessageType.PINGRESP, false);
}
}
var st=Owner.Get<long>(".cfg/XD_SleepTime", Owner);
ResetTimer(st.value>0?(3100+(int)st.value*1550):_duration); // t_wakeup
state=State.ASleep;
break;
}
if(_sendQueue.Count>0 && !(msg=_sendQueue.Peek()).IsRequest) {
_sendQueue.Dequeue();
}
}
}
}
private void ResetTimer(int period=0) {