Esempio n. 1
0
        public void ConnectAsync()
        {
            string temp;

            while (WriteQueue.TryDequeue(out temp))
            {
                ;
            }
            IsQuitting = false;
            if (Socket != null && Socket.Connected)
            {
                throw new InvalidOperationException("Socket is already connected to server.");
            }
            Socket          = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ReadBuffer      = new byte[ReadBufferLength];
            ReadBufferIndex = 0;
            Socket.BeginConnect(ServerHostname, ServerPort, ConnectComplete, null);
            PingTimer          = new Timer(30000);
            PingTimer.Elapsed += (sender, e) =>
            {
                if (!string.IsNullOrEmpty(ServerNameFromPing))
                {
                    SendRawMessage("PING :{0}", ServerNameFromPing);
                }
            };
        }
Esempio n. 2
0
        /// <summary>
        /// Connects to the IRC server.
        /// </summary>
        public void ConnectAsync()
        {
            if (Socket != null && Socket.Connected)
            {
                throw new InvalidOperationException("Socket is already connected to server.");
            }
            Socket             = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ReadBuffer         = new byte[ReadBufferLength];
            ReadBufferIndex    = 0;
            PingTimer          = new Timer(30000);
            PingTimer.Elapsed += (sender, e) =>
            {
                if (!string.IsNullOrEmpty(ServerNameFromPing))
                {
                    //SendRawMessage("PING :{0}", ServerNameFromPing);
                    SendRawMessage($"PING LAG{new Random().Next(100000, 999999)}");
                }
            };
            var checkQueue = new Timer(1000);

            checkQueue.Elapsed += (sender, e) =>
            {
                string nextMessage;
                if (WriteQueue.Count > 0)
                {
                    while (!WriteQueue.TryDequeue(out nextMessage))
                    {
                        ;
                    }
                    SendRawMessage(nextMessage);
                }
            };
            checkQueue.Start();
            Socket.BeginConnect(ServerHostname, ServerPort, ConnectComplete, null);
        }
Esempio n. 3
0
        public void ConnectToServer()
        {
            for (int sid = 0; sid < Servers.Count; sid++)
            {
                var serv = Servers[sid];
                for (int i = 0; i < serv.Ports.Length; i++)
                {
                    try
                    {
                        TcpClient client = new TcpClient(AddressFamily.InterNetwork);
                        var       result = client.BeginConnect(serv.Host, serv.Ports[i], null, null);
                        result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(3.0), false);
                        OnChatLogRep($"正在连接至 {serv.Host}:{serv.Ports[i]}");
                        if (!client.Connected)
                        {
                            OnChatLogRep($"连接至 {serv.Host}:{serv.Ports[i]} 超时!");
                        }
                        else if (client.Connected)
                        {
                            OnChatLogRep($"成功连接至 {serv.Host}:{serv.Ports[i]}");
                            //client.EndConnect(result);

                            Socket = client.Client;

                            ReadBuffer         = new byte[ReadBufferLength];
                            ReadBufferIndex    = 0;
                            PingTimer          = new Timer(30000);
                            PingTimer.Elapsed += (sender, e) =>
                            {
                                if (!string.IsNullOrEmpty(ServerNameFromPing))
                                {
                                    SendRawMessage("PING :{0}", ServerNameFromPing);
                                }
                            };
                            var checkQueue = new Timer(1000);
                            checkQueue.Elapsed += (sender, e) =>
                            {
                                string nextMessage;
                                if (WriteQueue.Count > 0)
                                {
                                    while (!WriteQueue.TryDequeue(out nextMessage))
                                    {
                                        ;
                                    }
                                    SendRawMessage(nextMessage);
                                }
                            };
                            checkQueue.Start();

                            ConnectComplete(result);
                            return;
                        }
                    }
                    catch (Exception ex)
                    {
                        OnChatLogRep(ex.Message);
                    }
                }
            }
        }
Esempio n. 4
0
        public static void WriteNext()
        {
            var list = new List <WriteObject>();

            for (int i = 0; i < Math.Min(1000, WriteQueue.Count); i++)
            {
                WriteObject ColObj;
                WriteQueue.TryDequeue(out ColObj);
                list.Add(ColObj);
            }

            var col = db?.GetCollection <WriteObject>("WriteObjects");

            col?.Insert(list);
        }
        private static void TryFlushQueue()
        {
            if (!_isInRetry && WriteQueue.IsEmpty)
            {
                return;
            }

            while (true)
            {
                Thread.Sleep(_retryDelayMiliseconds);

                // if the error store is still down, sleep again
                if (!Default.Test())
                {
                    continue;
                }

                // empty queue
                while (!WriteQueue.IsEmpty)
                {
                    Error e;
                    // if we can't pop one off, get out of here
                    if (!WriteQueue.TryDequeue(out e))
                    {
                        return;
                    }

                    try
                    {
                        Default.LogError(e);
                    }
                    catch
                    {
                        // if we had an error logging, stick it back in the queue and jump out, else we'll iterate this thing forever
                        Default.QueueError(e);
                        break;
                    }
                }
                // if we emptied the queue, return to a normal state
                if (WriteQueue.IsEmpty)
                {
                    _isInRetry = false;
                    TryFlushQueue(); // clear out any that may have come in due to thread races
                    return;
                }
            }
        }
Esempio n. 6
0
        private void MessageSent(IAsyncResult result)
        {
            if (NetworkStream == null)
            {
                OnNetworkError(new SocketErrorEventArgs(SocketError.NotConnected));
                IsWriting = false;
                return;
            }

            try
            {
                NetworkStream.EndWrite(result);
            }
            catch (IOException e)
            {
                var socketException = e.InnerException as SocketException;
                if (socketException != null)
                {
                    OnNetworkError(new SocketErrorEventArgs(socketException.SocketErrorCode));
                }
                else
                {
                    throw;
                }
                return;
            }
            finally
            {
                IsWriting = false;
            }

            OnRawMessageSent(new RawMessageEventArgs((string)result.AsyncState, true));

            string nextMessage;

            if (WriteQueue.Count > 0)
            {
                while (!WriteQueue.TryDequeue(out nextMessage))
                {
                    ;
                }
                SendRawMessage(nextMessage);
            }
        }
Esempio n. 7
0
        public async Task SendRawMessage(string message, params object[] format)
        {
            message = string.Format(message, format);

            lock (WriteQueue)
            {
                if (IsWriting)
                {
                    WriteQueue.Enqueue(message);
                    return;
                }
                IsWriting = true;
            }

            var data = Encoding.GetBytes(message + "\r\n");

            try
            {
                await NetworkStream.WriteAsync(data, 0, data.Length);
            }
            catch (Exception e)
            {
                if (NetworkStream == null)
                {
                    return;
                }
                OnNetworkError(new UnhandledExceptionEventArgs(e, true));
                Quit();
                return;
            }

            OnRawMessageSent(new RawMessageEventArgs(message, true));

            lock (WriteQueue)
            {
                IsWriting = false;
            }
            if (WriteQueue.TryDequeue(out message))
            {
                await SendRawMessage(message);
            }
        }