title: StackOverFlow in recursive function C#
body: <p>I have this code, but there is an recursive function and i can't optimize it, that's why i always have StackOverFlow exception.
  Can you help me to optimize it?
  I use this void to get all info or to try again if some errors are found.</p>
  
  <pre><code> public void Parse(byte[] data)
      {
          Socket skt = new Socket(SocketType.Dgram, ProtocolType.Udp);
          skt.ReceiveTimeout = 1000;
  
          skt.Connect(Encryptor.GetNextIP(), port);
          skt.Send(data);
          try
          {
           //a lot of actions to get the opcode
              switch (opCode)
              {
                  case 0x01:
                      p = new Packet(opCode);
                      p.WriteArray(Encryptor.ClientData(answer, false));
                      Regex rgx = new Regex("\"(?&lt;Name&gt;.+?):");
                      string part = p.ReadAString();
                      string res;
                      if (part[part.Length - 1] != '}') part += '}';
                      if (rgx.Match(part).Groups["Name"].Value == "")
                      {
                          p = null;
                          Parse(data);
                          break;
                      }
                      else
                      { res = "ID=" + rgx.Match(part).Groups["Name"].Value; }
                      ParseInfo(rgx.Match(part).Groups["Name"].Value);
                      p = null;
                      Encryptor = null;
                      break;
                  default: string ans = Encoding.ASCII.GetString(recv.Take(bytes).ToArray());
                      if (ans.Contains("EndOfStream") || ans.Contains("Begin"))
                      {
                          Failed();
                          Encryptor = null;
                          break;
                      }
                      else
                      {
                          p = null;
                          Parse(data);
                      }
                      break;
              }
          }
          catch
          {
              skt.Close();
              skt.Dispose();
              GC.Collect();
              Parse(data);
          }
      }
  </code></pre>
  
  <p>Thank you in advance.</p>