Прием файлов по сокетам - C#

Узнай цену своей работы

Формулировка задачи:

Реализую прием файлов по сокетам. Проблема в том, что файл приходит не весь. Причем если тестирую в местной сети, то все нормально. Но когда запускаю удаленно, то эти же файлы НЕ ВСЕГДА приходят полностью? Подскажите что не так? Вот часть кода: На стороне сервера шлю размер файла и затем сам файл:
connection.Socket.Send(Encoding.GetEncoding(1251).GetBytes(fl.Length.ToString()));
connection.Socket.SendFile(GetInformation);
На стороне клиента:
if (trabl) //подключился!
{
  string fileSize = RecvSize(); //получаем размер файла
  if (fileSize != "")
  {
    if (!RecvFile(flName, Convert.ToInt32(fileSize))) //результат получения файла
      MessageBox.Show("Получена только часть файла");
  }
               
  sock.Shutdown(SocketShutdown.Both);
  sock.Close();
}
 
//получаем размер файла
private string RecvSize()
{
    string sizeFl = "";
 
    if (sock.Connected)
    {
        string message = "";
        int y = 0;
        while (y == 0)
        {
            byte[] bytes = new byte[1024];
            int BytesRec = sock.Receive(bytes);
            message = Encoding.GetEncoding(1251).GetString(bytes, 0, BytesRec);
            if (1024 - BytesRec != 0) y++;
        }
 
        if (message != "")
           sizeFl = message;
    }
 
    return sizeFl;
}
 
//прием файла
private bool RecvFile(string nameFl, int sizeFl)
{
    bool tr = false;
 
    if (sock.Connected)
    {
        string message = "";
        int y = 0;
        while (y == 0)
        {
            byte[] bytes = new byte[1024];
            int BytesRec = sock.Receive(bytes);
            message += Encoding.GetEncoding(1251).GetString(bytes, 0, BytesRec); //получаем все пакеты
            if (1024 - BytesRec != 0) y++;
        }
 
        if (message != "")
        {
 
            StreamWriter sw = new StreamWriter(nameFl, false, Encoding.GetEncoding(1251));
            sw.Write(message);
            sw.Flush();
            sw.Close();
 
            FileInfo fi = new FileInfo(nameFl);
            if (fi.Length == sizeFl) tr = true;
 
        }
    }
 
    return tr;
}

Решение задачи: «Прием файлов по сокетам»

textual
Листинг программы
SendingFl(_tempMsg, "<EndMsg>"); //отправляем файл сообщения
private void SendingFl(string fl, string lbl)
{
  StreamReader sr = new StreamReader(fl, Encoding.GetEncoding(1251));
  string str = sr.ReadToEnd();
  if (sock.Connected)
  {
    byte[] msg = Encoding.GetEncoding(1251).GetBytes(str + lbl); //добавляем метку конца файла
    sock.Send(msg); //отправляем байты
  }
  sr.Close();
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы