Передача файлов по протоколу 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();
}
}
}
}