Socket File Transfer отправка неполных файлов в C # - PullRequest
1 голос
/ 26 января 2012

Я пробую свои силы в программировании сокетов в C # (.NET).Я сослался на пару примеров из codeproject, но моя передача файлов всегда отправляет неполные данные.

Данные очень очень маленьких размеров отлично работают, например, 1 КБ.Но файлы большего размера передаются не полностью, а именно изображения.

Вот мой код клиента, который отправляет файл на сервер.В clientData хранится двоичный файл этого файла.

byte[] fileData = File.ReadAllBytes(filePath + fileName);
            byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
            byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);

            fileNameLen.CopyTo(clientData, 0);
            fileNameByte.CopyTo(clientData, 4);
            fileData.CopyTo(clientData, 4 + fileNameByte.Length);

            curMsg = "Connection to server ...";
            clientSock.Connect(ipEnd);
            int count;
            curMsg = "File sending...";
            count = clientSock.Send(clientData);
            MessageBox.Show(count+" "+clientData.Length);

            curMsg = "Disconnecting...";
            clientSock.Close();

В то время как здесь приведен мой код сервера, который получает файл.

                sock.Listen(100);

            curMsg = "Running and waiting to receive file.";
            Socket clientSock = sock.Accept();

            byte[] clientData = new byte[1024 * 5000];

            int receivedBytesLen = clientSock.Receive(clientData);
            curMsg = "Receiving data...";

            int fileNameLen = BitConverter.ToInt32(clientData, 0);
            string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);

            BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath +"/"+ fileName, FileMode.Append)); ;
            bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);

            curMsg = "Saving file...";

            bWrite.Close();
            clientSock.Close();

Что смешно, когда я устанавливаюточка останова на 'send' на клиенте, файл передается нормально.Я наблюдаю количество байтов на обоих концах, и байты передачи совпадают, когда я использую точку останова, а когда я не получаю, полученные байты меньше, чем переданные байты на клиенте.

Что я делаю неправильно

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Вы забыли реализовать протокол!Чтобы использовать TCP, вы должны разработать и реализовать протокол, который определяет, какие байты будут отправляться и как получатель будет идентифицировать сообщения или элементы данных протокола.Вы не сделали ничего из этого.Ваш код приема не может знать, получил ли он весь файл или нет, потому что нет протокола, который бы сообщал об этом, или никакого кода для реализации такого протокола.Так что, конечно, он ошибается - у него нет способа сделать это правильно.

Если receivedBytesLen равен 1, ваш код ужасно сбоит.

1 голос
/ 26 января 2012

Базовый уровень сети или TCP не всегда может отправлять весь файл в виде одного фрагмента.Вы можете попытаться выполнить цикл while, пока не получите точную / полную длину файла.

Для этого вам может понадобиться сначала отправить длину файла.

И даможет работать в режиме отладки, но может отличаться во время выполнения.

...