void OnUDPReceived(string endPointIp, byte[] data, int size) { int head = 0; while (head < size) { BytePacker packer = new BytePacker(data); short datasize = packer.ReadShort(); #if DISABLE_CHANNEL_VARINT short channelId = packer.ReadShort(); #else int s = 0; short channelId = VarintBitConverter.ToShort(packer, out s); #endif if (channelId == (short)PreservedChannelId.Beacon) { } else if (channelId == (short)PreservedChannelId.Health) { if (nodeMap.ContainsKey(endPointIp)) { ComNode node = nodeMap[endPointIp]; node.HealthLostCount = 0; } } else if (!dataChannelMap.ContainsKey(channelId)) { } else { IDataChannel channel = dataChannelMap[channelId]; if (channel.CheckMode == CheckMode.Sequre) { if (nodeMap.ContainsKey(endPointIp)) { ComNode node = nodeMap[endPointIp]; node.HealthLostCount = 0; object container = channel.FromStream(ref packer); channel.Received(node, container); } } else { object container = channel.FromStream(ref packer); channel.Received(null, container); } } head += datasize + 4; } }
void OnUDPReceived(string endPointIp, byte[] data, int size) { int head = 0; while (head < size) { BytePacker packer = new BytePacker(data); short datasize = packer.ReadShort(); #if DISABLE_CHANNEL_VARINT short channelId = packer.ReadShort(); #else int s = 0; short channelId = VarintBitConverter.ToInt16(packer, out s); #endif if (channelId == (short)PreservedChannelId.Beacon) { if (acceptBeacon && !isConnecting && !IsConnected) { string beaconData = (string)DataSerializer.Deserialize <string>(packer); if (BeaconAccept(beaconData)) { Connect(endPointIp); } } } else if (!dataChannelMap.ContainsKey(channelId)) { } else { if (serverNode == null) { break; } if (endPointIp == serverNode.IP) { healthLostCount = 0; IDataChannel channel = dataChannelMap[channelId]; object container = channel.FromStream(ref packer); channel.Received(serverNode, container); } } head += datasize + 4; } }
void OnUnreliableReceived(IPEndPoint endPoint, byte[] data, int size) { int head = 0; while (head < size) { BytePacker packer = new BytePacker(data); short datasize = packer.ReadShort(); #if DISABLE_CHANNEL_VARINT short channelId = packer.ReadShort(); #else int s = 0; short channelId = VarintBitConverter.ToShort(packer, out s); #endif IDataChannel channel; if (dataChannelMap.TryGetValue(channelId, out channel)) { if (channel.CheckMode == CheckMode.Sequre) { ComNode node; if (nodeUdpMap.TryGetValue(endPoint.Address.ToString(), out node)) { object container = channel.FromStream(ref packer, null); channel.Received(node, container); } } else { object container = channel.FromStream(ref packer, null); channel.Received(null, container); } } head += datasize + 4; } }
public override object Deserialize(BytePacker packer) { return(packer.ReadShort()); }
public async Task Start() { cancelToken.Token.Register(() => client.Close()); int resSize = 0; short channelId = 0; bool isRent = false; byte[] buffer = null; do { try { resSize = await nStream.ReadAsync(receiveBuffer, 0, 2, cancelToken.Token).ConfigureAwait(false); if (resSize != 0) { receivePacker.Position = 0; resSize = receivePacker.ReadShort(); #if DISABLE_CHANNEL_VARINT await nStream.ReadAsync(receiveBuffer, 0, 2, cancelToken.Token).ConfigureAwait(false); receivePacker.Position = 0; channelId = receivePacker.ReadShort(); await nStream.ReadAsync(receiveBuffer, 0, resSize, cancelToken.Token).ConfigureAwait(false); #else int s = 0; channelId = VarintBitConverter.ToInt16(nStream, out s); await nStream.ReadAsync(receiveBuffer, 0, resSize, cancelToken.Token).ConfigureAwait(false); #endif buffer = arrayPool.Rent(resSize); if (buffer != null) { isRent = true; } else { buffer = new byte[resSize]; isRent = false; } Array.Copy(receiveBuffer, buffer, resSize); //Util.Log("TCP:" + resSize); } } catch//(Exception e) { //Util.Log("TCP:" + e.Message); break; } if (resSize == 0) { break; } if (cancelToken.IsCancellationRequested) { break; } if (Global.SyncContext != null) { Global.SyncContext.Post((state) => { if (cancelToken.IsCancellationRequested) { return; } CallbackParam param = (CallbackParam)state; if (OnReceive != null) { OnReceive(param.Ip, param.channelId, param.buffer, param.size); } if (isRent) { arrayPool.Return(buffer); } }, new CallbackParam(IP, channelId, buffer, resSize, isRent)); } else { if (OnReceive != null) { OnReceive(IP, channelId, receiveBuffer, resSize); } } } while (client.Connected); Disconnect(); }
async Task <bool> OnPoll( TCPConnection connection, NetworkStream nStream, byte[] receiveBuffer, BytePacker receivePacker, CancellationTokenSource cancelToken ) { int resSize = 0; int tmpSize = 0; short channelId = 0; bool isRent = false; byte[] buffer = null; try { resSize = await ReadAsync(nStream, receiveBuffer, 2, cancelToken).ConfigureAwait(false); if (resSize != 0) { receivePacker.Position = 0; resSize = receivePacker.ReadShort(); #if DISABLE_CHANNEL_VARINT tmpSize = await ReadAsync(nStream, receiveBuffer, 2, cancelToken).ConfigureAwait(false); if (tmpSize == 0) { throw new EndOfStreamException(); } receivePacker.Position = 0; channelId = receivePacker.ReadShort(); #else int s = 0; channelId = VarintBitConverter.ToShort(nStream, out s); #endif tmpSize = await ReadAsync(nStream, receiveBuffer, resSize, cancelToken).ConfigureAwait(false); if (tmpSize == 0) { throw new EndOfStreamException(); } buffer = arrayPool.Rent(resSize); if (buffer != null) { isRent = true; } else { buffer = new byte[resSize]; isRent = false; } Array.Copy(receiveBuffer, buffer, resSize); //Util.Log("TCP:" + resSize); } } catch//(Exception e) { //Util.Log("TCP:" + e.Message); return(false); } if (resSize == 0) { return(false); } if (cancelToken.IsCancellationRequested) { return(false); } if (syncContext != null) { syncContext.Post((state) => { if (cancelToken.IsCancellationRequested) { return; } CallbackParam param = (CallbackParam)state; OnReliableReceived(param.endPoint, param.channelId, param.buffer, param.size); if (isRent) { arrayPool.Return(buffer); } }, new CallbackParam((IPEndPoint)connection.Client.Client.RemoteEndPoint, channelId, buffer, resSize, isRent)); } else { OnReliableReceived((IPEndPoint)connection.Client.Client.RemoteEndPoint, channelId, buffer, resSize); } return(true); }
void OnUnreliableReceived(IPEndPoint endPoint, byte[] data, int size) { int head = 0; while (head < size) { BytePacker packer = new BytePacker(data); short datasize = packer.ReadShort(); #if DISABLE_CHANNEL_VARINT short channelId = packer.ReadShort(); #else int s = 0; short channelId = VarintBitConverter.ToShort(packer, out s); #endif IDataChannel channel; if (dataChannelMap.TryGetValue(channelId, out channel)) { if (channelId == (short)PreservedChannelId.Beacon) { } else if (channelId == (short)PreservedChannelId.UdpNotify) { IssueIdData idData = (IssueIdData)channel.FromStream(ref packer); try { userNodeMapLock.AcquireReaderLock(1000); ComNode n; if (userNodeMap.TryGetValue(idData.Id, out n)) { //Util.Log("UdpUserName:" + userName); ComSnowballNode node = (ComSnowballNode)n; if (node.UdpEndPoint == null && node.AesDecrypter != null) { byte[] decrypted = node.AesDecrypter.Decrypt(idData.encryptionData); if (decrypted.SequenceEqual(Global.UdpRawData)) { node.UdpEndPoint = endPoint; if (nodeUdpMap.ContainsKey(endPoint)) { nodeUdpMap.Remove(endPoint); } nodeUdpMap.Add(endPoint, node); SendInternal(node, (short)PreservedChannelId.UdpNotifyAck, endPoint.Port); byte[] key = GenerateTmpKey(); node.TmpKey = key; SendInternal(node, (short)PreservedChannelId.Health, key); node.IsConnected = true; if (OnConnected != null) { OnConnected(node); } } } } } finally { userNodeMapLock.ReleaseReaderLock(); } } else { if (channel.CheckMode == CheckMode.Sequre || channel.Encryption == Encryption.Aes) { ComNode node; if (nodeUdpMap.TryGetValue(endPoint, out node)) { IDecrypter decrypter = null; if (channel.Encryption == Encryption.Rsa) { decrypter = rsaDecrypter; } else if (channel.Encryption == Encryption.Aes) { decrypter = node.AesDecrypter; } object container = channel.FromStream(ref packer, decrypter); channel.Received(node, container); } } else { IDecrypter decrypter = null; if (channel.Encryption == Encryption.Rsa) { decrypter = rsaDecrypter; } object container = channel.FromStream(ref packer, decrypter); channel.Received(null, container); } } } head += datasize + 4; } }
void OnUnreliableReceived(IPEndPoint endPoint, byte[] data, int size) { int head = 0; while (head < size) { BytePacker packer = new BytePacker(data); short datasize = packer.ReadShort(); #if DISABLE_CHANNEL_VARINT short channelId = packer.ReadShort(); #else int s = 0; short channelId = VarintBitConverter.ToShort(packer, out s); #endif if (channelId == (short)PreservedChannelId.Beacon) { if (acceptBeacon && !isConnecting && !IsTcpConnected) { string beaconData = (string)DataSerializer.Deserialize <string>(packer); if (BeaconAccept(beaconData)) { Connect(endPoint.Address.ToString()); } } } else { IDataChannel channel; if (dataChannelMap.TryGetValue(channelId, out channel)) { if (channelId == (short)PreservedChannelId.Health) { if (serverNode == null) { break; } if (serverNode.UdpEndPoint == null && serverNode.TcpEndPoint.Address.Equals(endPoint.Address)) { serverNode.UdpEndPoint = endPoint; } } if (channel.CheckMode == CheckMode.Sequre) { IDecrypter decrypter = null; if (channel.Encryption == Encryption.Rsa) { throw new InvalidOperationException("Client cant receive data via RSA channel."); } else if (channel.Encryption == Encryption.Aes) { decrypter = serverNode.AesDecrypter; } if (serverNode == null) { break; } if (endPoint.Address.Equals(serverNode.UdpEndPoint.Address)) { object container = channel.FromStream(ref packer, decrypter); channel.Received(serverNode, container); } } else { IDecrypter decrypter = null; if (channel.Encryption == Encryption.Rsa) { throw new InvalidOperationException("Client cant receive data via RSA channel."); } else if (channel.Encryption == Encryption.Aes) { decrypter = serverNode.AesDecrypter; } object container = channel.FromStream(ref packer, decrypter); channel.Received(serverNode, container); } } } head += datasize + 4; } }