private void ProcessProtocol(long maxMilliseconds) { if (_processMode == NetMode.ProcessPause) { return; } _frameWatcher.Reset(); _frameWatcher.Start(); int processed = 0; while (_frameWatcher.ElapsedMilliseconds < maxMilliseconds) { ProtocolStruct?p = FetchOne(); if (p == null) { break; } if (OnRecvProtocol != null) { processed++; OnRecvProtocol(p.Value.Type, OctetsStream.Wrap(Octets.Wrap(p.Value.Data))); } } }
private static byte[] GenerateKeyByPassword(byte[] identity, byte[] password, byte[] nonce) { return(new HMACMD5(password).ComputeHash(Octets.Wrap(identity).Append(nonce).GetBytes())); }
private void BeginReceive() { Socket sock = _socket; //closure 的问题,需要这句 try { sock.BeginReceive(_input, 0, InputSize, SocketFlags.None, ar => { _actions.Enqueue(() => { try { int received = sock.EndReceive(ar); if (received > 0) { _inputBuf.Append(_inputSecurity.Update(Octets.Wrap(_input, received))); var os = OctetsStream.Wrap(_inputBuf); while (os.Remaining > 0) { int tranpos = os.Begin(); try { int type = os.UnmarshalSize(); int size = os.UnmarshalSize(); if (size > os.Remaining) { os.Rollback(tranpos); break; // not enough } _protocols.Enqueue(new Protocol(type, os.UnmarshalFixedSizeBytes(size))); } catch (MarshalException) { os.Rollback(tranpos); break; } } if (os.Position != 0) { _inputBuf.EraseAndCompact(os.Position, ReserveInputBufSize); } BeginReceive(); } else { Close(sock, new Exception("the socket channel has reached end-of-stream")); } } catch (Exception e) { Close(sock, e); } }); }, null); } catch (Exception e) { Close(sock, e); } }