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