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); }
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(); } }