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; }, "即時キャンセルではない場合"); } }
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); }
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), "受け取ったエンドポイントに送信出来る"); } }
public async Task ConnectHost(DiscoveryRoom room, CancellationToken token = default) { InitConnect(token); SetConnection(await Connection.ConnectToRoom(room, token: m_Cancellation.Token)); }
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); } } } }