コード例 #1
0
ファイル: MazeServer.cs プロジェクト: 5l1v3r1/Maze-1
        protected void InternalAddChannel(IDataChannel channel, int channelId)
        {
            var channelInfo = new DataChannelInfo(channel, channelId);

            if (!_channels.TryAdd(channelId, channelInfo))
            {
                throw new InvalidOperationException("The channel id is already in use");
            }

            Logger.Debug("Add channel with id {channelId}", channelId);

            channel.Send           = (buffer, offset, count, hasOffset) => ChannelSendData(channelInfo, buffer, offset, count, hasOffset);
            channel.RequiredOffset = _customOffset + 5;
        }
コード例 #2
0
ファイル: MazeServer.cs プロジェクト: 5l1v3r1/Maze-1
        private async Task ChannelSendData(DataChannelInfo channel, byte[] buffer, int offset, int count, bool hasOffset)
        {
            if (hasOffset)
            {
                BinaryUtils.WriteInt32(buffer, offset - 5, channel.ChannelId);
                buffer[offset - 1] = (byte)(channel.IsSynchronized ? 1 : 0);

                await _socket.SendFrameAsync(MazeSocket.MessageOpcode.Message,
                                             new ArraySegment <byte>(buffer, offset - 5, count + 5), true, CancellationToken.None);

                return;
            }

            using (var newBuffer = AllocateBuffer(count + 5))
            {
                BinaryUtils.WriteInt32(newBuffer.Buffer, newBuffer.Offset, channel.ChannelId);
                newBuffer.Buffer[newBuffer.Offset + 4] = (byte)(channel.IsSynchronized ? 1 : 0);

                Buffer.BlockCopy(buffer, offset, newBuffer.Buffer, newBuffer.Offset + 5, count);
                await _socket.SendFrameAsync(MazeSocket.MessageOpcode.Message, new ArraySegment <byte>(newBuffer.Buffer, newBuffer.Offset, count + 5),
                                             true, CancellationToken.None);
            }
        }