Прием файлов по сокетам - 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();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д