Передача файлов по сети С++

332
27 февраля 2018, 06:04

Передаю файлы на сервер вот так:

const int _size=4096;
char _buf[_size];
FILE* file;
file = fopen(address.c_str(), "rb");
int BytesRead = 0;
while (!feof(file)) {
    ZeroMemory(_buf, _size);
    BytesRead = fread(_buf, 1, _size, file);
    if (BytesRead > 0) {
        send(_skt, _buf, BytesRead, 0); // send data
        cout << BytesRead << endl;
        ZeroMemory(_buf, _size);
        recv(_skt, _buf, _size, 0);     // receive SUCCESS
    }
}
send(_skt, "eof", 3, 0);            // send eof
fclose(file);
cout << "transmitting successful" << endl;

Сервер пишет файлы в определенную папку. Текстовые файлы копируются таким образом на сервер без проблем. Размер и содержимое совпадает. Но с .exe беда. Проблема в отправке. Если разделить размер файла на размер буфера, то количество отправок не совпадает с реальным. В итоге файлы пишутся едва ли на 10% от своего размера и, конечно же, не работают. Где ошибка ?

Принимаю вот так:

#define FAIL "-1"
#define SUCCESS "0"
fstream IncFile;
IncFile.open(FileName, fstream::out);
int nbytes = 0;
while (1) {
    ZeroMemory(_buf, _size);
    nbytes = recv(sock, _buf, _size, 0);
    if (nbytes == SOCKET_ERROR) {
        cout << GetTime() << "\tERROR while receive: "
            << WSAGetLastError()
            << "\tsocket " << sock << endl;
        return 0;
    }
    if ((string)_buf != "eof") {
        IncFile << _buf;
        send(sock, SUCCESS, strlen(SUCCESS), 0);
    }
    else
        break;
}
IncFile.close();
READ ALSO
можно ли вставить данные бинарно из файла одним куском

можно ли вставить данные бинарно из файла одним куском

Можно ли из файла вставить одним куском память без ее буферизации?На примере: допустим, у меня есть vector и файл в котором подряд лежит энное...

231