private void ReceiveCallback(IAsyncResult ar) {
if(_udp==null || _udp.Client==null) {
return;
}
IPEndPoint re=new IPEndPoint(IPAddress.Any, 0);
Byte[] buf=null;
try {
buf = _udp.EndReceive(ar, ref re);
byte[] addr=re.Address.GetAddressBytes();
bool allow=true;
if(!_myIps.Any(z => addr.SequenceEqual(z))) {
if(buf.Length>1) {
var mt=(MsMessageType)(buf[0]>1?buf[1]:buf[3]);
if((mt==MsMessageType.CONNECT || mt==MsMessageType.SEARCHGW) && addr.Length==_wla_arr.Length) {
for(int i=addr.Length-1; i>=0; i--) {
if((addr[i] & _wlm_arr[i])!=_wla_arr[i]) {
allow=false;
break;
}
}
}
if(allow) {
MsDevice.ProcessInPacket(this, addr, buf, 0, buf.Length);
} else if(_verbose) {
var msg=MsMessage.Parse(buf, 0, buf.Length);
if(msg!=null) {
Log.Debug("restricted {0}: {1} {2}", this.Addr2If(addr), BitConverter.ToString(buf), msg.ToString());
}
}
}
}
}
catch(ObjectDisposedException) {
return;
}
catch(Exception ex) {
Log.Error("ReceiveCallback({0}, {1}) - {2}", re, buf==null?"null":BitConverter.ToString(buf), ex.ToString());
}
if(_udp!=null && _udp.Client!=null) {
_udp.BeginReceive(new AsyncCallback(ReceiveCallback), null);
}
}
private void SendAdv(object o) {