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