Пример #1
0
        private int AddSession(AeronClientSession session)
        {
            if (session == null)
            {
                throw new ArgumentNullException(nameof(session));
            }

            var connectionId = 0;

            lock (_connectionsLock)
            {
                for (var i = 0; i < _clientSessions.Length; i++)
                {
                    if (_clientSessions[i] == null)
                    {
                        connectionId       = ConnectionIndexToId(i);
                        _clientSessions[i] = session;
                        break;
                    }
                }

                if (connectionId == 0)
                {
                    var newSessions = new AeronClientSession[_clientSessions.Length * 2];
                    _clientSessions.CopyTo(newSessions, 0);
                    connectionId = ConnectionIndexToId(_clientSessions.Length);
                    newSessions[_clientSessions.Length] = session;
                    _clientSessions = newSessions;
                }
            }

            return(connectionId);
        }
Пример #2
0
 private void RemoveSession(AeronClientSession session)
 {
     lock (_connectionsLock)
     {
         for (var i = 0; i < _clientSessions.Length; i++)
         {
             if (_clientSessions[i] == session)
             {
                 _clientSessions[i] = null;
                 break;
             }
         }
     }
 }
Пример #3
0
 private void SessionDisconnected(AeronClientSession session)
 {
     RemoveSession(session);
     session.OnDisconnected.Invoke();
     session.Dispose();
 }
Пример #4
0
        public int Connect(string serverHost,
                           int serverPort,
                           Action onConnectedDelegate,
                           Action onDisconnectedDelegate,
                           AeronClientMessageReceivedHandler onMessageReceived,
                           int connectionResponseTimeoutMs)
        {
            if (serverHost == null)
            {
                throw new ArgumentNullException(nameof(serverHost));
            }

            if (_isTerminatedUnexpectedly)
            {
                return(-1);
            }

            string serverHostIp;

            if (serverHost.Equals("localhost", StringComparison.OrdinalIgnoreCase) || serverHost.Equals("127.0.0.1", StringComparison.OrdinalIgnoreCase))
            {
                // TODO IPC channel for local communication
                serverHostIp = "127.0.0.1";
            }
            else
            {
                var ipv4 =
                    Dns.GetHostEntry(serverHost).AddressList
                    .FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork)
                    ?? throw new ArgumentException($"Cannot resolve serverHost ip for {serverHost}");
                serverHostIp = ipv4.ToString();
            }

            var serverChannel = Utils.RemoteChannel(serverHostIp, serverPort);
            var publication   = _client.AddExclusivePublication(serverChannel, AeronServer.ServerStreamId);

            var localIp  = UdpUtils.GetLocalIPAddress(serverHostIp, serverPort);
            var streamId = MachineCounters.Instance.GetNewClientStreamId();

            GetChannelAndSubscription(localIp, streamId, out var clientChannel, out var subscription);

            var session = new AeronClientSession(this,
                                                 serverChannel,
                                                 publication,
                                                 subscription,
                                                 onConnectedDelegate,
                                                 onDisconnectedDelegate,
                                                 onMessageReceived);
            var connectionId = AddSession(session);

            _log.Info($"Connecting: {session}");

            var handshakeRequest = new AeronHandshakeRequest
            {
                Channel  = clientChannel,
                StreamId = streamId
            };

            if (!session.SendHandshake(handshakeRequest, connectionResponseTimeoutMs))
            {
                RemoveSession(session);
                session.Dispose();
                return(-1);
            }

            return(connectionId);
        }