public override string ToString() { var sb = new StringBuilder(); sb.AppendLine(LocalIp.ToString()); if (RemoteIp != null) { sb.AppendLine(RemoteIp.ToString()); } if (!String.IsNullOrEmpty(ProcessName)) { sb.AppendLine($"{ProcessName} ({ProcessId})"); if (ProcessFilename != null) { sb.AppendLine(ProcessFilename); } } else { sb.AppendLine("Process not available"); } sb.AppendLine(); return(sb.ToString()); }
IEnumerator ClientTcpRoutine() { bool run = true; if (Tcp == null || !Tcp.Connected) { yield return(null); } TcpStream = new NetworkStream(Tcp.Client); IPEndPoint remote = (IPEndPoint)Tcp.Client.RemoteEndPoint; int dataLen; string msg; MsgType type; // Function like a thread; run until terminated while (run) { try { if (TcpStream.DataAvailable) { dataLen = TcpStream.Read(TcpRead, 0, TcpRead.Length); byte[] tempBuffer = new byte[dataLen]; for (int i = 0; i < tempBuffer.Length; i++) { tempBuffer[i] = TcpRead[i + SUBHEADER_SIZE]; } msg = Encoding.ASCII.GetString(tempBuffer); type = GetMsgType(TcpRead); LocalConsole.Instance.Log("Received [" + type + "] from " + remote.Address + " on port " + remote.Port, true); switch (type) { // Handshake means server is challenging for session id case MsgType.HANDSHAKE: SendMsgTcp(_session, MsgType.HANDSHAKE); break; // Status generally means a heartbeat check from the server case MsgType.STATUS: if (dataLen == SUBHEADER_SIZE) // Empty Status packet is a heartbeat { SendMsgTcp("", MsgType.STATUS); } else { LocalConsole.Instance.Log("Status msg received"); } break; // Contains session data case MsgType.SESSION: string[] msgSplit = msg.Split(DELIM); if (msgSplit.Length == 3) // SessionId, Udp port, and Tcp port { if (Int32.TryParse(msgSplit[1], out int nUdp) && Int32.TryParse(msgSplit[2], out int nTcp)) { _session = msgSplit[0]; _remoteUdpPort = nUdp; _remoteTcpPort = nTcp; LocalConsole.Instance.Log("Successfully obtained session data, reconnecting..."); ConnectToRemote(RemoteIp.ToString()); } else { LocalConsole.Instance.Log("Error parsing ports from session data"); } } else { LocalConsole.Instance.Log("Error parsing session info from data"); } break; case MsgType.MSG: default: LocalConsole.Instance.Log("Msg received"); break; } } } catch (SocketException s) { LocalConsole.Instance.LogError("SocketException in ClientTcpRoutine: Code " + s.ErrorCode, true); } catch (IOException io) { LocalConsole.Instance.LogError("IOException in ClientTcpRoutine: " + io.Message, true); } catch (ObjectDisposedException o) { LocalConsole.Instance.LogError("ObjectDisposedException in ClientTcpRoutine: " + o.Message + "," + o.ObjectName, true); } // yield return null must be in while loop yield return(null); } }