Пример #1
0
        private void UDPReceiver()
        {
            StringToForm messageDelegate = MessageReceive;                         //Создание делегата принимаемого сообщения
            IPEndPoint   endPoint        = new IPEndPoint(IPAddress.Any, UDPPort); //Сетевая конечная точка

            while (true)
            {
                byte[] recieveData  = receivingClient.Receive(ref endPoint); //Возвращает UDP-датаграмму, которая была послана удаленным узлом
                byte[] commandBytes = new byte[6];                           //Массив байт комманды
                byte[] data         = new byte[recieveData.Length - 6];      //Массив файл данных
                Array.Copy(recieveData, 6, data, 0, data.Length);            //Копирование данных в массив из принятого массива
                Array.Copy(recieveData, commandBytes, 6);                    //Копирование байт команды из принятного массива

                string command = Encoding.Unicode.GetString(commandBytes);   //Преобразование команды в строку

                switch (command)                                             //Выбор действия исходя из команды
                {
                case "RIF":                                                  //Команда принятия индекс файла (RecieveIndexFile)
                {
                    ProcessingIndexFile(data);                               //Обработка принятого index-файла
                    break;                                                   //Выход из switch
                }

                case "UFR":
                {
                    ProcessingUserFileRequest(data);
                    break;
                }

                case "MSG":
                {
                    string message = Encoding.Unicode.GetString(data);
                    Invoke(messageDelegate, message);
                    break;
                }

                case "IFR":         //Команда запроса index-файла (IndexFileRequest)
                {
                    if (Encoding.Unicode.GetString(data) != thisUser)
                    {
                        SendIndexFile();
                    }
                    break;
                }

                default: return;            //Если неопознанная команда - ничего не предпринимать
                }
            }
        }
Пример #2
0
        private async void ProcessingUserFileRequest(byte[] data)
        {
            StringToForm logWriteDelegate = LogWrite;
            string       fullRequest      = Encoding.Unicode.GetString(data);

            string[] request = fullRequest.Split('^');
            if (request[0] == thisUser)
            {
                return;
            }
            string fileName = request[1];

            string[] userInfo = request[0].Split('_');
            string   userIP   = userInfo[1];

            IPAddress  address;
            FileInfo   file;
            FileStream fileStream;

            if (!IPAddress.TryParse(userIP, out address))
            {
                MessageBox.Show("Error with IP Address");
                return;
            }
            try
            {
                file       = new FileInfo("share/" + fileName);
                fileStream = file.OpenRead();
            }
            catch
            {
                MessageBox.Show("Error opening file");
                return;
            }

            // Connecting
            TcpClient client = new TcpClient();

            try
            {
                await client.ConnectAsync(address, TCPPort);
            }
            catch
            {
                MessageBox.Show("Error connecting to destination");
                return;
            }
            NetworkStream ns = client.GetStream();

            // Send file info
            { // This syntax sugar is awesome
                byte[] fileName1      = ASCIIEncoding.Unicode.GetBytes(file.Name);
                byte[] fileNameLength = BitConverter.GetBytes(fileName1.Length);
                byte[] fileLength     = BitConverter.GetBytes(file.Length);
                await ns.WriteAsync(fileLength, 0, fileLength.Length);

                await ns.WriteAsync(fileNameLength, 0, fileNameLength.Length);

                await ns.WriteAsync(fileName1, 0, fileName1.Length);
            }

            // Sending
            int read;
            int totalWritten = 0;

            byte[] buffer = new byte[32 * 1024]; // 32k chunks
            while ((read = await fileStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
            {
                await ns.WriteAsync(buffer, 0, read);

                totalWritten += read;
            }

            fileStream.Dispose();
            client.Close();
            Invoke(logWriteDelegate, DateTime.Now.ToLongTimeString() + ":" + " The file " + fileName + " was downloaded by user " + userInfo[0]);
            //MessageBox.Show("Sending complete!");
        }