Неполадки с передачей данных по сокетам - C#
Формулировка задачи:
Здравствуйте
Я сделал программу, которая передает по сокетам файл. Сокеты - типа Stream с протоколом TCP. Если я запускаю программу на локальном адресе (127.0.0.1), то все в порядке, файлы корректно передаются, без ошибок. Но если я передаю этот файл даже по локальной сети, то передается всего 1920 Байт. Немного изменил структуру кода, теперь передается всего 1460 байт. В чем проблемма? С чем это связано? Как это пофиксить?
Код (Меню для запуска сервера и клиента):
Заранее пре-благодарен тем, кто помог
Console.Clear();
Console.WriteLine("Введите 0 для режима "Сервер", 1 для режима "Клиент"");
string _choice = Console.ReadLine();
if (_choice == "0") { Server(); }
if (_choice == "1") { Client(); }
else
{
Console.Clear();
Console.WriteLine("Неверно выбран режим сокета");
Console.ReadKey();
}
void Server()
{
Console.Clear();
IPEndPoint _EndIP1 = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 47001);
IPEndPoint _EndIP2 = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 47002);
_RecieveData();
void _RecieveData()
{
try
{
String _FileName = null;
Console.WriteLine("Ожидание подключений...");
_RecieveFileName();
_RecieveFileData();
void _RecieveFileName()
{
using (Socket _ServerS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
_ServerS.Bind(_EndIP1);
_ServerS.Listen(1);
using (Socket _ClientS = _ServerS.Accept())
{
Console.WriteLine("Получение данных о файле...");
int _Count = 0;
byte[] _Buffer = new byte[256];
do
{
_Count = _ClientS.Receive(_Buffer);
_FileName = _FileName + Encoding.Default.GetString(_Buffer, 0, _Count);
} while (_ClientS.Available > 0);
Console.WriteLine("Данные о файле получены...");
}
}
}
void _RecieveFileData()
{
using (Socket _ServerS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
_ServerS.Bind(_EndIP2);
_ServerS.Listen(1);
using (Socket _ClientS = _ServerS.Accept())
{
Console.WriteLine("Скачивание файла...");
using(MemoryStream _File = new MemoryStream())
{
int _Count = 0;
byte[] _Buffer = new byte[1];
do
{
_Count = _ClientS.Receive(_Buffer);
_File.Write(_Buffer, 0, _Count);
} while (_ClientS.Available > 0);
Console.WriteLine("Скачивание файла завершено...");
using (FileStream _FS = new FileStream(_FileName, FileMode.Create))
{
_File.Position = 0;
_File.CopyTo(_FS);
Console.WriteLine("Файл {0} размером {1} Байт сохранен...\n", _FileName, _File.Length);
}
}
}
}
}
_RecieveData();
}
catch (Exception _ex)
{
Console.WriteLine(_ex);
Console.ReadKey();
_RecieveData();
}
}
}
void Client()
{
Console.Clear();
Console.WriteLine("Введите конечный IP");
IPAddress _IPAddr = IPAddress.Parse(Console.ReadLine());
IPEndPoint _EndIP1 = new IPEndPoint(_IPAddr, 47001);
IPEndPoint _EndIP2 = new IPEndPoint(_IPAddr, 47002);
_TransferData();
void _TransferData()
{
try
{
Byte[] _FileName = null;
Byte[] _File = null;
Console.Clear();
Console.WriteLine("Нажмите для выбора файла...");
Console.ReadKey();
OpenFileDialog _OFD = new OpenFileDialog();
if ((_OFD.ShowDialog()) != DialogResult.OK)
{
Console.Clear();
Console.WriteLine("Не выбран файл");
Console.ReadKey();
_TransferData();
}
string[] _FileFullName = _OFD.FileName.Split('\\');
_FileName = Encoding.Default.GetBytes(_FileFullName[_FileFullName.Length - 1]);
using (FileStream _FS = new FileStream(_OFD.FileName, FileMode.Open))
{
_File = new Byte[_FS.Length];
_FS.Read(_File, 0, _File.Length);
}
Console.WriteLine("Обработка файла завершена. Соединение с сервером...");
using (Socket _ClientFI = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
_ClientFI.Connect(_EndIP1);
Console.WriteLine("Отправка информации о файле...");
_ClientFI.Send(_FileName);
Console.WriteLine("Информация о файле отправлена...");
}
Thread.Sleep(50);
using (Socket _ClientFD = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
_ClientFD.Connect(_EndIP2);
Console.WriteLine("Отправка файла...");
_ClientFD.Send(_File);
Console.WriteLine("Файл отправлен...");
}
Console.ReadKey();
_TransferData();
}
catch (Exception _ex)
{
Console.WriteLine(_ex);
Console.ReadKey();
_TransferData();
}
}
}Решение задачи: «Неполадки с передачей данных по сокетам»
textual
Листинг программы
} while (_ClientS.Available > 0);