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