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());
        }
Пример #2
0
        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);
            }
        }