Передача файлов по протоколу UDP - C#
Формулировка задачи:
Здравствуйте! Я написал программу которая передает файл с введенного IP на твой пк, ну и в общем, при вводе IP 255.255.255.255 все работает, а при вводе любого другого IP нет! Подскажите пожалуйста как можно исправить?!
Файловый сервер:
Файловый клиент:
P.S. Спасибо!
using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Xml.Serialization; using System.Diagnostics; using System.Threading; public class UdpFileServer { // Информация о файле (требуется для получателя) [Serializable] public class FileDetails { public string FILETYPE = ""; public long FILESIZE = 0; } private static FileDetails fileDet = new FileDetails(); // Поля, связанные с UdpClient private static IPAddress remoteIPAddress; private const int remotePort = 5002; private static UdpClient sender = new UdpClient(); private static IPEndPoint endPoint; // Filestream object private static FileStream fs; [STAThread] static void Main(string[] args) { try { // Получаем удаленный IP-адрес и создаем IPEndPoint Console.WriteLine("Введите удаленный IP-адрес"); remoteIPAddress = IPAddress.Parse(Console.ReadLine().ToString());//"127.0.0.1"); endPoint = new IPEndPoint(remoteIPAddress, remotePort); // Получаем путь файла и его размер (должен быть меньше 8kb) Console.WriteLine("Введите путь к файлу и его имя"); fs = new FileStream(@Console.ReadLine().ToString(), FileMode.Open, FileAccess.Read); if (fs.Length > 8192) { Console.Write("Файл должен весить меньше 8кБ"); sender.Close(); fs.Close(); return; } // Отправляем информацию о файле SendFileInfo(); // Ждем 2 секунды Thread.Sleep(2000); // Отправляем сам файл SendFile(); Console.ReadLine(); } catch (Exception eR) { Console.WriteLine(eR.ToString()); } } public static void SendFileInfo() { // Получаем тип и расширение файла fileDet.FILETYPE = fs.Name.Substring((int)fs.Name.Length - 3, 3); // Получаем длину файла fileDet.FILESIZE = fs.Length; XmlSerializer fileSerializer = new XmlSerializer(typeof(FileDetails)); MemoryStream stream = new MemoryStream(); // Сериализуем объект fileSerializer.Serialize(stream, fileDet); // Считываем поток в байты stream.Position = 0; Byte[] bytes = new Byte[stream.Length]; stream.Read(bytes, 0, Convert.ToInt32(stream.Length)); Console.WriteLine("Отправка деталей файла..."); // Отправляем информацию о файле sender.Send(bytes, bytes.Length, endPoint); stream.Close(); } private static void SendFile() { // Создаем файловый поток и переводим его в байты Byte[] bytes = new Byte[fs.Length]; fs.Read(bytes, 0, bytes.Length); Console.WriteLine("Отправка файла размером " + fs.Length + " байт"); try { // Отправляем файл sender.Send(bytes, bytes.Length, endPoint); } catch (Exception eR) { Console.WriteLine(eR.ToString()); } finally { // Закрываем соединение и очищаем поток fs.Close(); sender.Close(); } Console.WriteLine("Файл успешно отправлен."); Console.Read(); } }
using System; using System.IO; using System.Net; using System.Diagnostics; using System.Net.Sockets; using System.Text; using System.Xml.Serialization; public class UdpFileClient { // Детали файла [Serializable] public class FileDetails { public string FILETYPE = ""; public long FILESIZE = 0; } private static FileDetails fileDet; // Поля, связанные с UdpClient private static int localPort = 5002; private static UdpClient receivingUdpClient = new UdpClient(localPort); private static IPEndPoint RemoteIpEndPoint = null; private static FileStream fs; private static Byte[] receiveBytes = new Byte[0]; [STAThread] static void Main(string[] args) { // Получаем информацию о файле GetFileDetails(); // Получаем файл ReceiveFile(); } private static void GetFileDetails() { try { Console.WriteLine("-----------*******Ожидание информации о файле*******-----------"); // Получаем информацию о файле receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint); Console.WriteLine("----Информация о файле получена!"); XmlSerializer fileSerializer = new XmlSerializer(typeof(FileDetails)); MemoryStream stream1 = new MemoryStream(); // Считываем информацию о файле stream1.Write(receiveBytes, 0, receiveBytes.Length); stream1.Position = 0; // Вызываем метод Deserialize fileDet = (FileDetails)fileSerializer.Deserialize(stream1); Console.WriteLine("Получен файл типа ." + fileDet.FILETYPE + " имеющий размер " + fileDet.FILESIZE.ToString() + " байт"); } catch (Exception eR) { Console.WriteLine(eR.ToString()); } } public static void ReceiveFile() { try { Console.WriteLine("-----------*******Ожидайте получение файла*******-----------"); // Получаем файл receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint); // Преобразуем и отображаем данные Console.WriteLine("----Файл получен... \nСохраняем..."); // Создаем временный файл с полученным расширением fs = new FileStream("temp." + fileDet.FILETYPE, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Write(receiveBytes, 0, receiveBytes.Length); Console.WriteLine("----Файл сохранен..."); Console.WriteLine("-------Открытие файла------"); // Открываем файл связанной с ним программой Process.Start(fs.Name); } catch (Exception eR) { Console.WriteLine(eR.ToString()); } finally { fs.Close(); receivingUdpClient.Close(); Console.Read(); } } }
Решение задачи: «Передача файлов по протоколу UDP»
textual
Листинг программы
using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Diagnostics; using System.IO; namespace TCPServer { class Program { static void Main(string[] args) { FileStream fs; // Устанавливаем для сокета локальную конечную точку IPHostEntry ipHost = Dns.GetHostEntry("localhost"); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 11000); // Создаем сокет Tcp/Ip Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Назначаем сокет локальной конечной точке и слушаем входящие сокеты try { sListener.Bind(ipEndPoint); sListener.Listen(10); // Начинаем слушать соединения while (true) { // Программа приостанавливается, ожидая входящее соединение Socket handler = sListener.Accept(); string data = null; // Мы дождались клиента, пытающегося с нами соединиться byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); data...// Здесь нужно принять байты от клиента // Создаем временный файл с полученным расширением fs = new FileStream("temp.", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Write(data, 0, data.Length); handler.Shutdown(SocketShutdown.Both); handler.Close(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { Console.ReadLine(); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д