потерять байты - PullRequest
       4

потерять байты

1 голос
/ 30 июля 2010

Я занимаюсь разработкой приложения, которое отправляет и получает данные между двумя компьютерами, но есть проблема, с которой я сталкиваюсь, когда я отправляю данные, размер файла будет составлять 4,56 КБ, но когда я получаю данные на другой стороне, размер файла уменьшается до 1,42 КБ изапись данных в файл также завершена, мой размер получаемого байта составляет 1024 * 5000. я использую c #. я использую TCP

вот мой код

я сначала отправляю данные, чтобы сообщить другому компьютерукакой файл я хочу получить

 private void GetLoginFile()
    {
        Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            char[] delimiter = splitter.ToCharArray();
            byte[] fileName = Encoding.UTF8.GetBytes(myIP + "_GetLoginFile"); //file name
            byte[] fileData;
            fileData = Encoding.UTF8.GetBytes("null");
            //byte[] fileData = reads.ReadToEnd().to; //file
            byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //lenght of file name
            clientData = new byte[4 + fileName.Length + fileData.Length];

            fileNameLen.CopyTo(clientData, 0);
            fileName.CopyTo(clientData, 4);
            fileData.CopyTo(clientData, 4 + fileName.Length);
            System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(serverIP);

            IPEndPoint ipEnd = new IPEndPoint(ipAdd, 9050);
            clientSock.Connect(ipEnd); //target machine's ip address and the port number
            clientSock.Send(clientData);

            byte[] clientData1 = new byte[1024 * 5000];
            string receivedPath = mypath + "XML\\";

            int receivedBytesLen = clientSock.Receive(clientData1);

            int fileNameLen1 = BitConverter.ToInt32(clientData1, 0);

            string fileName1 = Encoding.ASCII.GetString(clientData1, 4, fileNameLen1);
            //string file = Encoding.UTF8.GetString();

            BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName1, FileMode.Append));
            bWrite.Write(clientData1, 4 + fileNameLen1, receivedBytesLen - 4 - fileNameLen1);
            //clientSock.Shutdown(SocketShutdown.Send);

            bWrite.Close();
            clientSock.Close();
        }
        catch (Exception ex)
        {
            clientSock.Close();
            MessageBox.Show(ex.Message);
        }
    }

Может кто-нибудь помочь мне решить эту проблему.

Ответы [ 2 ]

3 голосов
/ 30 июля 2010

Ну, вы не дали никакого кода ... но я подозреваю это ваш код приема, который является неправильным.

Вы должны зацикливаться, читая до Readвызов в потоке возвращает 0. Не думайте, что вы получите все данные за один вызов.

РЕДАКТИРОВАТЬ: Да, посмотрите на ваш код приема:

int receivedBytesLen = clientSock.Receive(clientData1);

Что делает васдумаете, вы получили все данные, которые вам нужны за один звонок?Вам нужно выполнить цикл, получая до тех пор, пока другой конец не закроет соединение или вы не прочитаете все необходимые данные.

0 голосов
/ 30 июля 2010

Используете ли вы UDP-сокеты? Если это так, то все в порядке: UDP не является надежным. Используйте TCP для получения каждого отправленного байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...