Пример #1
0
        public async Task SerializeAsync_ResultBufferMatchesExpected(int totItems, int totThreads, int maxQueuedItems)
        {
            var cfg = GetConfig(totThreads, maxQueuedItems);

            TestItemMP[]      originalArray = new TestItemMP[totItems];
            List <TestItemMP> asyncArray    = new List <TestItemMP>();

            for (int f = 0; f < totItems; f++)
            {
                originalArray[f] = new TestItemMP()
                {
                    f = (byte)(1 + f % 32)
                }
            }
            ;
            MemoryStream ms = new MemoryStream();

            await using (var ser = new CollectionSerializerAsync <TestItemMP>(ms, cfg))
                foreach (var item in originalArray)
                {
                    await ser.SerializeAsync(item, CancellationToken.None);
                }

            byte[] originalArraySerialized = new ArraySegment <byte>(ms.GetBuffer(), 0, (int)ms.Position).ToArray();
            using (var streamReader = new MessagePackStreamReader(new MemoryStream(originalArraySerialized)))
                while (await streamReader.ReadAsync(CancellationToken.None) is ReadOnlySequence <byte> msgpack)
                {
                    asyncArray.Add(MessagePackSerializer.Deserialize <Frame <TestItemMP> >(msgpack, cancellationToken: CancellationToken.None));
                }
            Assert.AreEqual(originalArray.Select(f => f.f).ToArray(), asyncArray.Select(t => t.f).ToArray());
        }
 public void RemainingBytes_BeforeReading()
 {
     using (var reader = new MessagePackStreamReader(new MemoryStream()))
     {
         Assert.True(reader.RemainingBytes.IsEmpty);
     }
 }
        public async Task <int> ReadAsync_Baseline(BufferedStreamReaderConfig config_r, bool usingMemoryStream)
        {
            if (!usingMemoryStream)
            {
                FileHelper.FlushFileCache(tmpFilename_baseline);
            }
            try
            {
                int res = 0;
                using (StreamChain sc1 = new StreamChain())
                {
                    Stream s = sc1.ComposeChain(usingMemoryStream ? ms_baseline :
                                                File.Open(tmpFilename_baseline, FileMode.Open, FileAccess.Read, FileShare.None), config_r);
                    using (var streamReader = new MessagePackStreamReader(s, true))
                        while (await streamReader.ReadAsync(CancellationToken.None) is ReadOnlySequence <byte> msgpack)
                        {
                            var obj = MessagePackSerializer.Deserialize <Frame <T> >(msgpack, opts_standard, CancellationToken.None).Item;

                            res ^= obj.DoStuff();
                        }
                }
                return(res);
            }
            finally
            {
                if (usingMemoryStream)
                {
                    ms_baseline.Flush();
                    ms_baseline.Position = 0;
                }
            }
        }
        public void DoubleDisposal()
        {
            var ms     = new MemoryStream();
            var reader = new MessagePackStreamReader(ms);

            reader.Dispose();
            reader.Dispose();
        }
 public async Task StreamEndsWithNoMessage()
 {
     using (var reader = new MessagePackStreamReader(new MemoryStream()))
     {
         Assert.Null(await reader.ReadAsync(this.TimeoutToken));
         Assert.True(reader.RemainingBytes.IsEmpty);
     }
 }
Пример #6
0
 public TcpPoolItem(string hostName, int port)
 {
     Client = new TcpClient(hostName, port)
     {
         NoDelay = true
     };
     Stream = Client.GetStream();
     Reader = new MessagePackStreamReader(Stream);
 }
 public async Task ReadAsync_EveryTruncationPositionPossible()
 {
     using (var reader = new MessagePackStreamReader(new OneByteAtATimeStream(this.twoMessages)))
     {
         Assert.True((await reader.ReadAsync(this.TimeoutToken)).HasValue);
         Assert.True((await reader.ReadAsync(this.TimeoutToken)).HasValue);
         Assert.False((await reader.ReadAsync(this.TimeoutToken)).HasValue);
     }
 }
 public static async IAsyncEnumerable <X> Original_UnknownLengthArray_ReadAsync(string fileName)
 {
     using var stream = File.OpenRead(fileName);
     using var sr     = new MessagePackStreamReader(stream);
     while (await sr.ReadAsync(CancellationToken.None) is ReadOnlySequence <byte> msgpack)
     {
         yield return(MessagePackSerializer.Deserialize <Frame <X> >(msgpack));
     }
 }
Пример #9
0
        public async Task EnumerateArrayElements_OneByteAtATime()
        {
            var reader         = new MessagePackStreamReader(new OneByteAtATimeStream(this.arraySequence));
            int messageCounter = 0;

            await foreach (ReadOnlySequence <byte> elementSequence in reader.ReadArrayAsync(this.TimeoutToken))
            {
                Assert.Equal(ArrayContent[messageCounter++], MessagePackSerializer.Deserialize <object>(elementSequence));
            }
        }
Пример #10
0
        protected virtual async Task ProcessClient(TcpClient client)
        {
            UserCommandType         command;
            ReadOnlySequence <byte>?msgpack;
            ServiceResult           sr = new ServiceResult();
            var streamReader           = new MessagePackStreamReader(client.GetStream());

            while (client.Connected)
            {
                command = null;
                try
                {
                    msgpack = await streamReader.ReadAsync(_tokenSource.Token).ConfigureAwait(false);

                    if (!msgpack.HasValue)
                    {
                        break; // End of connection
                    }
                    command = MessagePackSerializer.Deserialize <UserCommandType>(msgpack.Value, cancellationToken: _tokenSource.Token);

                    if (command == null)
                    {
                        continue;
                    }

                    LogServerEvent(command);
                    sr.Message = await DataReceived(command).ConfigureAwait(false);

                    if (string.IsNullOrEmpty(sr.Message))
                    {
                        continue;
                    }
                    await MessagePackSerializer.SerializeAsync <ServiceResult>(client.GetStream(), sr).ConfigureAwait(false);
                }
                catch (IOException)
                {
                    // Client connection failed. Dispose of it
                    break;
                }
                catch (Exception e)
                {
                    if (command != null)
                    {
                        LogDebugEvent(command, e.Message);
                    }
                    else
                    {
                        Console.WriteLine(e);
                    }
                    Console.WriteLine(e);
                }
            }
            streamReader.Dispose();
            client.Dispose();
        }
        public async Task StreamEndsWithNoMessageAndExtraBytes()
        {
            // We'll include the start of the second message since it is multi-byte.
            var partialMessage = this.twoMessages.Slice(messagePositions[0], 1).ToArray();

            using (var reader = new MessagePackStreamReader(new MemoryStream(partialMessage)))
            {
                Assert.Null(await reader.ReadAsync(this.TimeoutToken));
                Assert.Equal(partialMessage, reader.RemainingBytes.ToArray());
            }
        }
Пример #12
0
        public async Task ReadMapHeader()
        {
            var reader = new MessagePackStreamReader(this.arraySequence.AsStream());
            var count  = await reader.ReadMapHeaderAsync(this.TimeoutToken);

            Assert.Equal(MapContent.Count, count);
            for (var i = 0; i < count; i++)
            {
                var elementSequence = await reader.ReadAsync(this.TimeoutToken);

                Assert.Equal(MapContent[i], MessagePackSerializer.Deserialize <object>(elementSequence.Value));
            }
        }
Пример #13
0
        static async Task <List <T> > DeserializeListFromStreamAsync <T>(Stream stream, CancellationToken cancellationToken)
        {
            var dataStructures = new List <T>();

            using (var streamReader = new MessagePackStreamReader(stream))
            {
                while (await streamReader.ReadAsync(cancellationToken) is ReadOnlySequence <byte> msgpack)
                {
                    dataStructures.Add(MessagePackSerializer.Deserialize <T>(msgpack, cancellationToken: cancellationToken));
                }
            }

            return(dataStructures);
        }
Пример #14
0
        private void StartReceivingMessages()
        {
            Task.Run(async() =>
            {
                try
                {
                    using (CancellationTokenSource tokenSource = new CancellationTokenSource())
                    {
                        // Keep receiving packets from the client and respond to them
                        // Eventually when the client disconnects we'll just get an exception and end the thread...

                        using (var streamReader = new MessagePackStreamReader(_netStream, true))
                        {
                            while (server.Clients.Contains(this))
                            {
                                if (_netStream.DataAvailable)
                                {
                                    try
                                    {
                                        ReadOnlySequence <byte>?sequence = await streamReader.ReadAsync(tokenSource.Token);
                                        if (sequence.HasValue)
                                        {
                                            ServerPack obj = MessagePackSerializer.Deserialize <ServerPack>(sequence.Value, PlayerdomGame.SerializerSettings, tokenSource.Token);
                                            HandleMessage(obj);
                                        }
                                    }
                                    catch (MessagePackSerializationException)
                                    {
                                    }
                                }

                                else
                                {
                                    Task.Delay(10).Wait();
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    if (e.GetType() == typeof(Exception))
                    {
                        server.logger("Exception thrown: " + e.Message);
                    }
                    server.RemoveClient(this);
                }
            });
        }
        public async Task StreamEndsCleanlyAfterMessage()
        {
            var oneMessage = this.twoMessages.Slice(0, this.messagePositions[0]).ToArray();

            using (var reader = new MessagePackStreamReader(new MemoryStream(oneMessage)))
            {
                var message1 = await reader.ReadAsync(this.TimeoutToken);

                Assert.NotNull(message1);
                Assert.Equal(oneMessage, message1.Value.ToArray());

                Assert.True(reader.RemainingBytes.IsEmpty);
                Assert.Null(await reader.ReadAsync(this.TimeoutToken));
                Assert.True(reader.RemainingBytes.IsEmpty);
            }
        }
        public async Task TwoMessagesInSingleRead()
        {
            using (var reader = new MessagePackStreamReader(new MemoryStream(this.twoMessages.ToArray())))
            {
                var message1 = await reader.ReadAsync(this.TimeoutToken);

                Assert.NotNull(message1);
                Assert.Equal(this.twoMessages.Slice(0, this.messagePositions[0]).ToArray(), message1.Value.ToArray());

                var message2 = await reader.ReadAsync(this.TimeoutToken);

                Assert.NotNull(message2);
                Assert.Equal(this.twoMessages.Slice(this.messagePositions[0], this.messagePositions[1]).ToArray(), message2.Value.ToArray());

                Assert.Null(await reader.ReadAsync(this.TimeoutToken));
            }
        }
        public async Task StreamEndsAfterMessageWithExtraBytes()
        {
            // Include the first message and one more byte
            var partialMessage = this.twoMessages.Slice(0, 2).ToArray();

            using (var reader = new MessagePackStreamReader(new MemoryStream(partialMessage)))
            {
                var firstMessage = await reader.ReadAsync(this.TimeoutToken);

                Assert.NotNull(firstMessage);
                Assert.Equal(partialMessage.Take(1), firstMessage.Value.ToArray());

                Assert.Equal(partialMessage.Skip(1), reader.RemainingBytes.ToArray());
                Assert.Null(await reader.ReadAsync(this.TimeoutToken));
                Assert.Equal(partialMessage.Skip(1), reader.RemainingBytes.ToArray());
            }
        }
Пример #18
0
        public async Task <ListNode> Deserialize(Stream s)
        {
            if (s is null)
            {
                throw new ArgumentNullException(nameof(s));
            }

            var indexToNodes = new Dictionary <int, (ListNode Node, int?IndexToRandom)>();

            using var streamReader = new MessagePackStreamReader(s);
            ListNode previousNode = null;
            var      index        = 0;

            while (await streamReader.ReadAsync(CancellationToken.None) is ReadOnlySequence <byte> msgpack)
            {
                var nodeData = MessagePackSerializer.Deserialize <NodeData>(msgpack);
                var node     = new ListNode
                {
                    Data     = nodeData.Data,
                    Previous = previousNode
                };

                if (previousNode != null)
                {
                    previousNode.Next = node;
                }

                indexToNodes.Add(index, (node, nodeData.IndexToRandom));

                index++;
                previousNode = node;
            }

            foreach (var(node, indexToRandom) in indexToNodes.Values)
            {
                if (indexToRandom != null)
                {
                    node.Random = indexToNodes[indexToRandom.Value].Node;
                }
            }

            return(indexToNodes.Any()
                ? indexToNodes[0].Node
                : null);
        }
        public async Task DiscardBufferedData()
        {
            var ms = new MemoryStream(this.twoMessages.ToArray());

            using (var reader = new MessagePackStreamReader(ms))
            {
                var message1a = await reader.ReadAsync(this.TimeoutToken);

                Assert.NotNull(message1a);
                Assert.Equal(this.twoMessages.Slice(0, this.messagePositions[0]).ToArray(), message1a.Value.ToArray());

                ms.Position = 0;
                reader.DiscardBufferedData();

                // Verify that we can read the message at the start of the new position.
                var message1b = await reader.ReadAsync(this.TimeoutToken);

                Assert.NotNull(message1b);
                Assert.Equal(this.twoMessages.Slice(0, this.messagePositions[0]).ToArray(), message1b.Value.ToArray());
            }
        }
Пример #20
0
        private T Call <T>(string method, params object[] arguments)
        {
            if (Client == null)
            {
                throw new Exception("Client == null");
            }

            if (!Client.Connected)
            {
                throw new Exception("Client not connected");
            }

            lock (Client)
            {
                var message = new object[] { 0, NextId++, method, arguments };
                var bin     = MessagePackSerializer.Serialize(message);

                var stream = Client.GetStream();

                stream.Write(bin);

                using (var reader = new MessagePackStreamReader(stream, true))
                {
                    if (reader.ReadAsync(CancellationToken.None).Result is ReadOnlySequence <byte> msgpack)
                    {
                        Debug.WriteLine(MessagePackSerializer.ConvertToJson(msgpack));

                        var response = (object[])MessagePackSerializer.Deserialize <object>(msgpack);

                        return((T)Convert.ChangeType(response[3], typeof(T)));
                    }
                    else
                    {
                        throw new Exception("Call failed");
                    }
                }
            }
        }
Пример #21
0
        static async Task Main(string[] args)
        {
            var cts = new CancellationTokenSource();

            Console.CancelKeyPress += (s, e) =>
            {
                Console.WriteLine("Canceling...");
                cts.Cancel();
                e.Cancel = true;
            };

            var psi = new ProcessStartInfo(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"..\..\..\..\Multiplier\bin\Debug\netcoreapp3.1\Multiplier.exe"));

            psi.RedirectStandardOutput = true;
            using var child            = Process.Start(psi);
            using var msgpackReader    = new MessagePackStreamReader(child.StandardOutput.BaseStream);
            ReadOnlySequence <byte>?msgpackSequence;

            while ((msgpackSequence = await msgpackReader.ReadAsync(cts.Token)).HasValue)
            {
                string json = MessagePackSerializer.ConvertToJson(msgpackSequence.Value);
                Console.WriteLine(json);
            }
        }
Пример #22
0
        public async Task Process()
        {
            UserCommandType         command;
            LogType                 log_in;
            ReadOnlySequence <byte>?msgpack;

            using (var streamReader = new MessagePackStreamReader(client.GetStream()))
            {
                while (client.Connected)
                {
                    command = null;
                    try
                    {
                        msgpack = await streamReader.ReadAsync(_tokenSource.Token);

                        if (!msgpack.HasValue)
                        {
                            if (!_tokenSource.IsCancellationRequested)
                            {
                                // Bad state, leave
                                break;
                            }
                        }
                        log_in = MessagePackSerializer.Typeless.Deserialize(msgpack.Value, cancellationToken: _tokenSource.Token) as LogType;
                        if (log_in == null)
                        {
                            continue;
                        }

                        AuditServer.AddBulkRecords(log_in.Items);
                        for (int i = log_in.Items.Length - 1; i >= 0; i--)
                        {
                            var record = log_in.Items[i];
                            if (record.GetType() == typeof(UserCommandType))
                            {
                                command = (UserCommandType)record;
                                if (command.command == commandType.DUMPLOG)
                                {
                                    AuditServer.DumpLog(command.filename);
                                }
                            }
                        }
                    }
                    catch (IOException)
                    {
                        // Client connection closed, eat and move on
                        break;
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        DebugType debugEvent = new DebugType
                        {
                            server       = Server.AUDIT_SERVER.Abbr,
                            debugMessage = e.Message
                        };
                        if (command != null)
                        {
                            debugEvent.command        = command.command;
                            debugEvent.transactionNum = command.transactionNum;
                            debugEvent.username       = command.username;
                        }
                        AuditServer.AddRecord(debugEvent);
                    }
                }
            }

            client.Close();
            client.Dispose();
        }
 internal V2Formatter(PipeWriter writer, Stream readingStream)
     : base(writer)
 {
     this.reader = new MessagePackStreamReader(readingStream, leaveOpen: false);
 }
Пример #24
0
        static async Task Main(string[] args)
        {
            //int connectionCount = 0;
            var config   = Config.Instance.dcthashserver;
            var listener = new TcpListener(config.ListenIPv6 ? IPAddress.IPv6Any : IPAddress.Any, config.ListenPort);

            try { listener.Start(); }
            catch
            {
                Console.WriteLine("Failed to listen {0} Exiting.", listener.LocalEndpoint);
                return;
            }
            Console.WriteLine("Listening {0}", listener.LocalEndpoint);

            using var gcTimer = new Timer((_) =>
            {
                GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
                GC.Collect();
            }, null, 600000, 600000);

            while (true)
            {
                var _client = await listener.AcceptTcpClientAsync().ConfigureAwait(false);

                //Interlocked.Increment(ref connectionCount);

                Task.Run(async() =>
                {
                    var client     = _client;
                    client.NoDelay = true;
                    var endpoint   = client.Client.RemoteEndPoint;
                    //Console.WriteLine("New connection({0}): {1}", connectionCount, endpoint);
                    try
                    {
                        using var tcp    = client.GetStream();
                        using var reader = new MessagePackStreamReader(tcp);
                        while (true)
                        {
                            using var cancel = new CancellationTokenSource(60000);
                            PictHashRequest req;
                            {
                                var msgpack = await reader.ReadAsync(cancel.Token).ConfigureAwait(false);
                                if (!msgpack.HasValue)
                                {
                                    Console.WriteLine("Failed to read MessagePack stream");
                                    break;
                                }
                                req = MessagePackSerializer.Deserialize <PictHashRequest>(msgpack.Value);
                            }
                            PictHashResult res;
                            long?dctHash;
                            using (var mediaMem = new MemoryStream(req.MediaFile, false))
                                using (var mem = new MemoryStream())
                                {
                                    //GdiPlusが腐ってるのでImageSharpで読み込む
                                    using (var img = SixLabors.ImageSharp.Image.Load <Rgba32>(mediaMem))
                                    {
                                        img.Save(mem, img.GetConfiguration().ImageFormatsManager.FindEncoder(SixLabors.ImageSharp.Formats.Bmp.BmpFormat.Instance));
                                    }
                                    mem.Seek(0, SeekOrigin.Begin);
                                    dctHash = PictHash.DCTHash(mem, req.Crop);
                                }
                            res = new PictHashResult()
                            {
                                UniqueId = req.UniqueId, DctHash = dctHash
                            };

                            await MessagePackSerializer.SerializeAsync(tcp, res, null, cancel.Token).ConfigureAwait(false);
                        }
                    }
                    catch (ExternalException e) { Console.WriteLine(e.Message); }   //gdiplusの例外
                    catch (OperationCanceledException) { }  //CancellationToken
                    catch (Exception e) { Console.WriteLine(e); }
                    client.Dispose();
                    //Interlocked.Decrement(ref connectionCount);
                    //Console.WriteLine("Disconnected({0}): {1}", connectionCount, endpoint);
                });
            }
        }
Пример #25
0
        public static async Task Marathon()
        {
            int mismatch = 0;
            int failure  = 0;

            long[] mismatchBits = new long[sizeof(long) * 8];
            var    config       = Config.Instance;
            var    db           = new DBHandler();

            using var client = new TcpClient("localhost", 12306);
            client.NoDelay   = true;
            using var tcp    = client.GetStream();
            using var reader = new MessagePackStreamReader(tcp);

            long downloaded_at = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
            int  mediaCount    = 0;

            while (true)
            {
                var result = await db.GetMediaPath(downloaded_at).ConfigureAwait(false);

                downloaded_at = result.MinDownloadedAt - 1;

                var compareHashBlock = new ActionBlock <string>(async(p) =>
                {
                    byte[] mediabytes;
                    try
                    {
                        using (var file = File.OpenRead(Path.Combine(config.crawl.PictPaththumb, p)))
                            using (var mem = new MemoryStream())
                            {
                                await file.CopyToAsync(mem).ConfigureAwait(false);
                                mediabytes = mem.ToArray();
                            }
                    }
                    catch (Exception e) { Console.WriteLine(e.Message); return; }

                    var a = PictHashClient.DCTHash(mediabytes, 0, "192.168.238.126");
                    var b = PictHashClient.DCTHash(mediabytes, 0, "localhost");
                    await Task.WhenAll(a, b).ConfigureAwait(false);
                    if (!a.Result.HasValue || !b.Result.HasValue)
                    {
                        Interlocked.Increment(ref failure);
                        Console.WriteLine("\t\t\tfailure");
                    }
                    else if (a.Result.Value != b.Result.Value)
                    {
                        Interlocked.Increment(ref mismatch);
                        ulong bits = (ulong)(a.Result.Value ^ b.Result.Value);
                        Interlocked.Increment(ref mismatchBits[Popcnt.X64.PopCount(bits)]);
                        //Console.WriteLine("{0:X16}", bits);
                    }
                }, new ExecutionDataflowBlockOptions()
                {
                    MaxDegreeOfParallelism = Environment.ProcessorCount
                });

                foreach (string p in result.MediaPath)
                {
                    compareHashBlock.Post(p);
                }
                mediaCount += result.MediaPath.Length;
                compareHashBlock.Complete();
                await compareHashBlock.Completion;

                for (int i = 0; i < mismatchBits.Length; i++)
                {
                    if (0 < mismatchBits[i])
                    {
                        Console.WriteLine("{0}: {1}", i, mismatchBits[i]);
                    }
                }
                Console.WriteLine("{0} / {1} mismatches.", mismatch, mediaCount);
            }
        }