Пример #1
0
        public async Task ローカルP2Pキャンセルテスト()
        {
            using (var host = Connection.StartLocalHost("TestRoom"))
                using (var server = new EchoServer(host))
                {
                    DiscoveryRoom room = null;
                    using (var discovery = new DiscoveryClient())
                    {
                        discovery.Start();
                        room = await discovery.GetRoomAsync("TestRoom");
                    }
                    await Assert.ThrowsExceptionAsync <OperationCanceledException>(() =>
                    {
                        var cancellationTokenSource = new CancellationTokenSource();
                        cancellationTokenSource.Cancel();
                        return(Connection.ConnectToRoom(room, token: cancellationTokenSource.Token));
                    }, "即時キャンセルの場合");

                    await Assert.ThrowsExceptionAsync <OperationCanceledException>(async() =>
                    {
                        var cancellationTokenSource = new CancellationTokenSource();
                        var task = Connection.ConnectToRoom(room, token: cancellationTokenSource.Token);
                        await Task.Yield();
                        cancellationTokenSource.Cancel();
                        await task;
                    }, "即時キャンセルではない場合");
                }
        }
Пример #2
0
        public DiscoveryRoom CreateRoom(IPAddress address, int discoveryPort)
        {
            var name = System.Text.Encoding.UTF8.GetString(Name.Array, Name.Offset, Name.Count);
            var data = new byte[DataSize];

            Buffer.BlockCopy(Data.Array, Data.Offset, data, 0, Data.Count);
            var room = new DiscoveryRoom(address, Port, name, data, discoveryPort);

            return(room);
        }
Пример #3
0
        public async Task Discovery経由のP2P通信()
        {
            byte[] data = Random.GenBytes(64);
            using var server = new UdpClient();
            server.Client.Bind(new IPEndPoint(IPAddress.Any, 0));
            var serverIP = server.Client.LocalEndPoint as IPEndPoint;

            using var service = new DiscoveryService("DataTest", serverIP, data);
            service.Start();
            using var discoveryClient = new DiscoveryClient();
            discoveryClient.Start();
            DiscoveryRoom room = await discoveryClient.GetRoomAsync("DataTest");

            Assert.AreEqual("DataTest", room.Name, "ルーム名が正しい");
            Assert.AreEqual(To(data), To(room.Data), "設定したデータを受け取れる");

            service.OnHolePunchRequest += (ep) =>
            {
                var packet = new Packet.DiscoveryHolePunch().Pack();
                server.Send(packet, packet.Length, ep);
            };

            using var client = new UdpClient();

            {
                var packet = new Packet.DiscoveryHolePunch().Pack();
                client.Send(packet, packet.Length, new IPEndPoint(room.Address, room.DiscoveryPort));
                var res = await client.ReceiveAsync();

                var ret = Packet.DiscoveryHolePunch.TryUnpack(res.Buffer, res.Buffer.Length, out _);
                Assert.IsTrue(ret, "ホールパンチのリクエストを受け取れる");
                Assert.AreEqual(room.Address, res.RemoteEndPoint.Address, "サーバーのアドレスから来ている");
                Assert.AreEqual(room.Port, res.RemoteEndPoint.Port, "サーバーのアドレスから来ている");
            }
            {
                client.Send(data, data.Length, new IPEndPoint(room.Address, room.Port));
                var res = await server.ReceiveAsync();

                Assert.AreEqual(To(data), To(res.Buffer), "受け取ったエンドポイントに送信出来る");
            }
        }
Пример #4
0
 public async Task ConnectHost(DiscoveryRoom room, CancellationToken token = default)
 {
     InitConnect(token);
     SetConnection(await Connection.ConnectToRoom(room, token: m_Cancellation.Token));
 }
Пример #5
0
        public async Task ローカルP2Pテスト()
        {
            using (var host = Connection.StartLocalHost("TestRoom"))
                using (var server = new EchoServer(host))
                {
                    DiscoveryRoom room = null;
                    using (var discovery = new DiscoveryClient())
                    {
                        discovery.Start();
                        room = await discovery.GetRoomAsync("TestRoom");
                    }
                    using (var conn1 = await Connection.ConnectToRoom(room))
                        using (var conn2 = await Connection.ConnectToRoom(room))
                        {
                            host.Channel.Bind <Channel.ReliableChannelConfig>(101);
                            conn1.Channel.Bind <Channel.ReliableChannelConfig>(101);
                            conn2.Channel.Bind <Channel.ReliableChannelConfig>(101);


                            for (int i = 0; i < 100; i++)
                            {
                                var text = "Text:" + (i + 1);
                                conn1.Send(host.SelfId, To(text));
                                conn2.Send(host.SelfId, To(text));
                                Message message;
                                while (!conn1.PollTryReadMessage(out message, TimeSpan.FromSeconds(1)))
                                {
                                    ;
                                }
                                Assert.AreEqual(text, To(message));
                                Assert.AreEqual(host.SelfId, message.Peer.ConnectionId);
                                while (!conn2.PollTryReadMessage(out message, TimeSpan.FromSeconds(1)))
                                {
                                    ;
                                }
                                Assert.AreEqual(text, To(message));
                                Assert.AreEqual(host.SelfId, message.Peer.ConnectionId);

                                conn1.Send(conn2.SelfId, To(text));
                                conn2.Send(conn1.SelfId, To(text));
                                while (!conn1.PollTryReadMessage(out message, TimeSpan.FromSeconds(1)))
                                {
                                    ;
                                }
                                Assert.AreEqual(text, To(message));
                                Assert.AreEqual(conn2.SelfId, message.Peer.ConnectionId);
                                while (!conn2.PollTryReadMessage(out message, TimeSpan.FromSeconds(1)))
                                {
                                    ;
                                }
                                Assert.AreEqual(text, To(message));
                                Assert.AreEqual(conn1.SelfId, message.Peer.ConnectionId);

                                host.Send(conn1.SelfId, To(text));
                                host.Send(conn2.SelfId, To(text));
                                while (!conn1.PollTryReadMessage(out message, TimeSpan.FromSeconds(1)))
                                {
                                    ;
                                }
                                Assert.AreEqual(text, To(message));
                                Assert.AreEqual(host.SelfId, message.Peer.ConnectionId);
                                while (!conn2.PollTryReadMessage(out message, TimeSpan.FromSeconds(1)))
                                {
                                    ;
                                }
                                Assert.AreEqual(text, To(message));
                                Assert.AreEqual(host.SelfId, message.Peer.ConnectionId);

                                conn1.Channel[101].Target(host.SelfId).Send(To(text));
                                conn2.Channel[101].Target(host.SelfId).Send(To(text));
                                while (!conn1.PollTryReadMessage(out message, TimeSpan.FromSeconds(1)))
                                {
                                    ;
                                }
                                Assert.AreEqual(text, To(message));
                                Assert.AreEqual(host.SelfId, message.Peer.ConnectionId);
                                while (!conn2.PollTryReadMessage(out message, TimeSpan.FromSeconds(1)))
                                {
                                    ;
                                }
                                Assert.AreEqual(text, To(message));
                                Assert.AreEqual(host.SelfId, message.Peer.ConnectionId);
                            }

                            {
                                var peer1ByHost = host.GetPeer(conn1.SelfId);
                                var peer2ByHost = host.GetPeer(conn2.SelfId);
                                var peer1       = conn2.GetPeer(conn1.SelfId);
                                var peer2       = conn1.GetPeer(conn2.SelfId);
                                Assert.IsTrue(peer1ByHost.IsConnection);
                                Assert.IsTrue(peer2ByHost.IsConnection);
                                Assert.IsTrue(peer1.IsConnection);
                                Assert.IsTrue(peer2.IsConnection);

                                conn1.BroadcastDisconnect();
                                await Task.Delay(20);

                                conn2.TryReadMessage(out _);

                                Assert.IsTrue(peer2ByHost.IsConnection);
                                Assert.IsFalse(peer1ByHost.IsConnection);
                                Assert.IsFalse(peer1.IsConnection);
                                Assert.IsFalse(peer2.IsConnection);

                                conn2.BroadcastDisconnect();
                                await Task.Delay(20);

                                Assert.IsFalse(peer2ByHost.IsConnection);
                            }
                        }
                }
        }