Exemplo n.º 1
0
        public bool TryConnectToServer()
        {
            var  serverIp      = IPAddress.Parse(m_Config.ServerIPAddress);
            var  waitToConnect = new TaskCompletionSource <bool>();
            bool isConnected   = false;

            AsyncTcpConnector.Connect(
                ip: serverIp,
                port: m_Config.ServerPort,
                leftTimeoutList: new Queue <TimeSpan>(new[]
            {
                TimeSpan.FromSeconds(1),
                TimeSpan.FromSeconds(1),
                TimeSpan.FromSeconds(1),
                TimeSpan.FromSeconds(1),
            }),
                onCompleted: (isSuccess, socket) =>
            {
                isConnected = isSuccess;
                if (!isConnected)
                {
                    Log.I.Warn("서버 연결 실패");
                    waitToConnect.SetResult(false);
                    return;
                }

                ServerConnection.I.OnConnected(socket);
                waitToConnect.SetResult(true);
            });

            waitToConnect.Task.Wait();
            return(isConnected);
        }
Exemplo n.º 2
0
        public void AsyncTcpAcceptor()
        {
            var listenIp   = IPAddress.Loopback;
            int listenPort = 12255;

            var acceptedConnections = new ConcurrentQueue <AsyncTcpConnection>();

            var acceptor = new AsyncTcpAcceptor(
                onNewConnection: accepted =>
            {
                var newConnection = new AsyncTcpConnection(accepted);
                newConnection.Subscribe(_ => 0, _ => { }, () => { });
                acceptedConnections.Enqueue(newConnection);
            });

            int numberOfBacklogSockets = 8;

            acceptor.Bind(listenIp, listenPort);
            acceptor.ListenAndStart(numberOfBacklogSockets);

            var isDone = new AutoResetEvent(false);

            Func <Socket, AsyncTcpConnection> tcpStreamCreator = socket =>
            {
                var newStream = new AsyncTcpConnection(socket);
                newStream.Subscribe(_ => 0, _ => { }, () => { });
                return(newStream);
            };

            AsyncTcpConnector.Connect(
                ip: listenIp,
                port: listenPort,
                leftTimeoutList: new Queue <TimeSpan>(new[]
            {
                TimeSpan.FromMilliseconds(100),
                TimeSpan.FromMilliseconds(100),
                TimeSpan.FromMilliseconds(100),
                TimeSpan.FromMilliseconds(100)
            }),
                onCompleted: (isConnected, socket) =>
            {
                Assert.IsTrue(isConnected);
                Assert.IsNotNull(socket);

                var newStream = tcpStreamCreator(socket);
                Assert.IsNotNull(newStream);

                isDone.Set();
            });

            Assert.IsTrue(isDone.WaitOne(TimeSpan.FromSeconds(5)));
            isDone.Reset();

            BecomeTrue(() =>
            {
                return(acceptedConnections.Count >= 1);
            }, TimeSpan.FromSeconds(1)).Wait();

            var connectionCount = 5 * numberOfBacklogSockets;

            for (int i = 0; i < connectionCount; i++)
            {
                AsyncTcpConnector.Connect(
                    ip: listenIp,
                    port: listenPort,
                    leftTimeoutList: new Queue <TimeSpan>(new[]
                {
                    TimeSpan.FromMilliseconds(100),
                    TimeSpan.FromMilliseconds(100),
                    TimeSpan.FromMilliseconds(100),
                    TimeSpan.FromMilliseconds(100)
                }),
                    onCompleted: (isConnected, socket) =>
                {
                    Assert.IsTrue(isConnected);
                    Assert.IsNotNull(socket);

                    var newStream = tcpStreamCreator(socket);
                    Assert.IsNotNull(newStream);

                    isDone.Set();
                });
            }

            BecomeTrue(() =>
            {
                return(acceptedConnections.Count >= connectionCount);
            }, TimeSpan.FromSeconds(1)).Wait();

            foreach (var c in acceptedConnections)
            {
                c.Dispose();
            }
        }