C ++ WinSock отправка файлов - PullRequest
       11

C ++ WinSock отправка файлов

0 голосов
/ 28 августа 2018

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

Чтобы воспроизвести такой код, я установил 2 буфера, один на стороне клиента, другой на стороне сервера. На стороне сервера я читаю 8192 байта из моего файла в буфер, затем отправляю его на клиентскую сторону, которая получает его и добавляет в мой буфер. Проблема в том, что после второй передачи файла, при каждой передаче, это SOCKET_ERROR, что, вероятно, означает, что что-то не так.

Сервер:

std::ifstream readFile;
        readFile.open(FileName, std::ios::binary | std::ios::ate);
        if (!readFile)
        {
            std::cout << "unable to open file" << std::endl;
        }
        int FileSize = readFile.tellg();
        readFile.seekg(0);
        int remainingBytes = 0;
        uint32_t FileSize32t = (uint32_t)FileSize;

        FileSize32t = htonl(FileSize32t);
        send(connections[ID], (char*)&FileSize32t, sizeof(uint32_t), 0);
        int sent_bytes = 0;
        int offset = 0;
        char data[8192];
        remainingBytes = FileSize;
        int i = 0;
        while (i<6)
        {
            readFile.read(data, 8192);
            if (remainingBytes < 8192)
            {
                sent_bytes = send(connections[ID], data+offset, remainingBytes, 0);
                remainingBytes -= sent_bytes;
                offset += sent_bytes;
            }
            else
            {                   
                sent_bytes = send(connections[ID], data+offset, 8192, 0);
                if (sent_bytes == SOCKET_ERROR)
                {
                    std::cout << "erro" << std::endl;
                }
                remainingBytes -= sent_bytes;
                offset += sent_bytes;
                std::cout <<"offset: "<< offset << std::endl;
                std::cout << "Sent bytes: " << sent_bytes << std::endl;
                std::cout << "remaining bytes: " << remainingBytes << std::endl;
            }       
            i++;
        }

Клиент:

char data[8192];
        std::ofstream writeFile;
        writeFile.open("Putin.jpg", std::ios::binary);
        int bytesReceieved = 0;
        int totalBytesReceieved = 0;
        int i = 0;
        while (i<6)
        {

            if (recvFileSize - totalBytesReceieved < 8192)
            {
                bytesReceieved = recv(connection, data+totalBytesReceieved, recvFileSize - totalBytesReceieved, 0);
                totalBytesReceieved += bytesReceieved;
            }
            else
            {
                bytesReceieved = recv(connection, data + totalBytesReceieved, 8192, 0);
                totalBytesReceieved += bytesReceieved;
                std::cout << totalBytesReceieved << std::endl;
            }   
            i++;
        }
        writeFile.write(data, totalBytesReceieved);
        std::cout << "transferência terminada, bytes recebidos: " << totalBytesReceieved << std::endl;

        writeFile.close();

Обратите внимание, что это всего лишь тестовая программа, и это, во-первых, одно из моих первых взаимодействий с C ++. Мне сказали, что это, вероятно, не лучший способ начать с C ++, но мне нужно, чтобы это задание было выполнено до 15 сентября, поэтому мне нужно закончить его независимо. Если вы обнаружите какие-либо ошибки или проблемы помимо моей первоначальной проблемы, не стесняйтесь указывать на них и, если можете, объясните мне, почему это неправильно.

Большое спасибо за вашу помощь.

...