Exemplo n.º 1
0
        public async Task ReceivePackets(Socket conn, byte[] buffer)
        {
            Array.Clear(buffer, 0, buffer.Length);
            string data = null;

            await conn.ReceiveAsync(buffer, SocketFlags.None);

            Regex findfilestart = new Regex(@"<(.*?)>");

            data = Encoding.ASCII.GetString(buffer).Replace("\0", "");

            var totallength = 0;

            string filetype = null;
            string filename = null;
            string encoding = null;

            long filesize = 0;

            Encoding newencoding = null;

            if (data.StartsWith("type<"))
            {
                MatchCollection fileinfo = findfilestart.Matches(data);

                totallength += fileinfo[0].Groups[1].Value.Length;
                totallength += fileinfo[1].Groups[1].Value.Length;
                totallength += fileinfo[2].Groups[1].Value.Length;
                totallength += fileinfo[3].Groups[1].Value.Length;


                filetype = fileinfo[0].Groups[1].Value;
                filename = fileinfo[1].Groups[1].Value;
                encoding = fileinfo[2].Groups[1].Value;

                long.TryParse(fileinfo[3].Groups[1].Value, out filesize);

                if (encoding == "UTF7")
                {
                    newencoding = Encoding.UTF7;
                }
                else if (encoding == "UTF8")
                {
                    newencoding = Encoding.UTF8;
                }
                else if (encoding == "UTF32")
                {
                    newencoding = Encoding.UTF32;
                }
                else if (encoding == "Unicode")
                {
                    newencoding = Encoding.Unicode;
                }
                else if (encoding == "BigEndianUnicode")
                {
                    newencoding = Encoding.BigEndianUnicode;
                }
                else if (encoding == "UTF32BE")
                {
                    newencoding = new UTF32Encoding(true, true);
                }
                else
                {
                    newencoding = Encoding.ASCII;
                }

                // Console.WriteLine(filesize);

                /*
                 * Console.WriteLine("\nFILETYPE : " + filetype);
                 * Console.WriteLine("FILENAME : " + filename);
                 * Console.WriteLine("FILESIZE : " + filesize);
                 */
            }

            if (data == "command not recognized!")
            {
                color.colored_print("\n" + data + "\n", "Red", "Black", true, false);
            }
            else
            {
                if (filesize > 0)
                {
                    Array.Clear(buffer, 0, totallength);

                    FileStream   newfile         = File.Create(filename);
                    BinaryWriter newStreamWriter = new BinaryWriter(newfile);

                    Console.WriteLine(buffer[0]);

                    long bytesRead = 0;

                    data = newencoding.GetString(buffer);

                    newStreamWriter.Write(data);

                    bytesRead += buffer.Length;

                    data = "";

                    while (bytesRead < filesize)
                    {
                        await conn.ReceiveAsync(buffer, SocketFlags.None);

                        data = newencoding.GetString(buffer);

                        // Console.Write(data);

                        newStreamWriter.Write(data);


                        Console.WriteLine("BEFORE :: " + bytesRead);
                        bytesRead += data.Length;
                        Console.WriteLine("AFTER :: " + bytesRead);
                        Array.Clear(buffer, 0, buffer.Length);
                    }

                    newStreamWriter.Close();
                    newfile.Close();
                }
                else
                {
                    Array.Clear(buffer, 0, buffer.Length);
                    while (true)
                    {
                        while (conn.Available > 0)
                        {
                            await conn.ReceiveAsync(buffer, SocketFlags.None);

                            data += Encoding.ASCII.GetString(buffer).Replace("\0", "");

                            Array.Clear(buffer, 0, buffer.Length);
                        }
                        break;
                    }
                    color.colored_print("\n" + data + "\n", "Green", "Black", true, false);
                }

                //color.colored_print("\n" + $"LENGTH : {data.Length} -- " + data + "\n\n", "Green", "Black", true);
            }

            Array.Clear(buffer, 0, buffer.Length);
        }