Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2011, 13:19   #1
free6878
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 22
Восклицание Передача файла по локальной сети

Господа вот такой вопрос! Нужно передавать файлы по сети! При чём файлы любого формата! Переодичность передачи высокая! Поэтому решил попробовать через UDP, но оказалось, что этот клиент ограничен размером файла не более 8 Кб, а мне нужно передавать файлы размером до 1 Мб.
Вот мой код в Visual C#:
Код:
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;

namespace FileSender
{
     public class FileSender
    {
         private static FileDetails fileDet = new FileDetails();
         
         //Поля связанные с UdpClient
         private static IPAddress remonteIPAddress;
         private const int remontePort = 5002;
         private static UdpClient sender = new UdpClient();
         private static IPEndPoint endPoint;

         //Обьект Filestream
         private static FileStream fs;

         //Информация о файле (требуется для получателя)
         [Serializable]
         public class FileDetails
         {
             public string FILETYPE = "";
             public long FILESIZE = 0;
         }
         [STAThread]
         static void Main(string[] args)
         {
             try
             {
                 //Получаем удалённый IP-адрес и создаём IPEndPoint
                 Console.WriteLine("Enter Remonte IP address");
                 remonteIPAddress = IPAddress.Parse(Console.ReadLine().ToString());
                 endPoint = new IPEndPoint(remonteIPAddress, remontePort);

                 // получаем путь файла (Важно: размер файла меньше 8К)
                 Console.WriteLine("Enter File path and name to send");
                 fs = new FileStream(@Console.ReadLine().ToString(), FileMode.Open, FileAccess.Read);
                 if (fs.Length > 8192)
                 {
                     Console.Write("This version transfer files with size < 8192 bytes");
                     sender.Close();
                     fs.Close();
                     return;
                 }
             }
             catch(Exception e)
             {
                 Console.WriteLine(e.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("Sending file details...");

             //отправляем информацию о файле
             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("Sending file...size="+fs.Length+"bytes");
             try
             {
                 sender.Send(bytes, bytes.Length, endPoint);//посылаем файл
             }
             catch (Exception e)
             {
                 Console.WriteLine(e.ToString());
             }
             finally
             {
                 //чистим объекты
                 fs.Close();
                 sender.Close();
             }
             Console.Read();
             Console.WriteLine("File sent successfully");
         }
    }
}
free6878 вне форума Ответить с цитированием
Старый 28.01.2011, 13:45   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от free6878 Посмотреть сообщение
попробовать через UDP, но оказалось, что этот клиент ограничен размером файла не более 8 Кб
Дануконешно. Просто это не очень подходящий протокой для вашей задачи. Юзайте TCP и будет щастье.


Цитата:
Переодичность передачи высокая!
Хм.. это как, файл размером 1MB нужно передавать 100 раз в секунду?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 28.01.2011, 14:49   #3
free6878
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 22
Восклицание

ТСР Это конечно хорошо, но куда девать лишний трафик на соединение и подтверждение. А если передача идёт с 10 компьютеров на один с частотой каждые 2 секунды, что тогда ! И при этом надо чтобы это немешало пользователям лазить по сети?!
free6878 вне форума Ответить с цитированием
Старый 28.01.2011, 15:00   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Лишнего трафика там не так и много (не более 2-3%), но если хочется поднимать функции TCP (подтвержение доставки, повторная передача потерь, сборка переставленных пакетов, выбор размера окна передачи) руками на основе UDP, то почему бы и нет, времени это много не займет, месяца за два справитесь.

Или у вас нет необходимости передавать файлы целыми и невредимымы, а более важно доставить информацию вовремя? Например, вы передаёте потоковое видео в реальном режиме времени. Тогда выбор UDP обоснован, осталось научиться им пользоваться.

Цитата:
А если передача идёт с 10 компьютеров на один с частотой каждые 2 секунды, что тогда !
А что тогда?

Цитата:
И при этом надо чтобы это немешало пользователям лазить по сети?!
Чудес не бывает, либо пропускной способности вашей сети хватит на передачу 5MB/секунду (это чуть больше половины пропускной способности обычной сотки, кстати), либо не хватит.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 28.01.2011, 15:23   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> куда девать лишний трафик на соединение и подтверждение

Этот же самый траффик (это теоретически, а практически - еще больший) ты потеряешь на организации собственного, т.е. прикладного квитирования доставки, если требуется обеспечить целостность доставки.
mss вне форума Ответить с цитированием
Старый 28.01.2011, 15:50   #6
free6878
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 22
Восклицание

Ладно если опустить проблему траффика! А как принимать данные по ТСР сразу с нескольких компьютеров! Разве можно одновременно прослушивать сразу несколько сокетов?! Или есть хитрости, при создании соединения ТСР?
free6878 вне форума Ответить с цитированием
Старый 28.01.2011, 15:54   #7
free6878
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 22
Восклицание

И вы знаете не где не нашёл примера для передачи файлов через ТСР!
Сообщения,да а файлы нет!? Как преобразовываются данные!?
free6878 вне форума Ответить с цитированием
Старый 28.01.2011, 16:31   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от free6878 Посмотреть сообщение
Разве можно одновременно прослушивать сразу несколько сокетов?!
ТСП-шный слушающий сокет создаёт новый сокет для каджого нового подключившегося клиента, так что одного слушающего сокета достаточно. Так работают веб-серверы, например. Слушают на 80 порту одним сокетом, а каждое новое соединение от клиента на этот порт порождает новый сокет, который используют для общения с этим и только этим клиентом.

Цитата:
Сообщение от free6878 Посмотреть сообщение
Сообщения,да а файлы нет!?
Файл — это просто длинное сообщение, не?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 28.01.2011, 17:50   #9
free6878
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 22
Восклицание

Так а если файлы придут одновременно, то вовремя получения порт будет занят и небудет слушать остальные поступающие сообщения!? А на сервере всё организовано гораздо сложнее! И тем более закодировать текст в байты для передачи это одно, а файл любого формата это совсем другие методы, посмотрите на мой текст в начале. Если бы всё было так просто, то я бы не спрашивал!
free6878 вне форума Ответить с цитированием
Старый 28.01.2011, 17:57   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Ничего там не будет занято, и ничего особо сложного на сервере нет.

Объясните, чем поток байт, сформированный из сообщения, отличается от потока байт, сформированного из файла? Это другие байты?

Вы постоянно пугаете сами себя совершенно непонятно откуда взятыми ужосами. А надо просто взять и сделать. Всё там будет отлично работать и ничего сложного там нет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача данных по локальной сети zzzzz Работа с сетью в Delphi 2 02.07.2011 19:24
передача данных по локальной сети DinamoBrynsk Помощь студентам 2 22.11.2010 22:17
Создание файла в локальной сети yulia Общие вопросы Delphi 4 19.08.2009 15:28
Передача файлов по локальной сети(Indy) Biowulf86 Помощь студентам 1 08.05.2008 13:08