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; //Если неопознанная команда - ничего не предпринимать } } }
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!"); }