Недавно мне был назначен клиент-серверный проект, представляющий собой чат, где можно отправлять и получать файлы, и мы можем использовать веб-камеры.
В настоящее время я работаю над передачей файлов, и, посмотрев некоторые онлайн-учебники, я заметил, что большинство из них используют смещения для записи в свои буферы, а затем записывают весь буфер в свой новый файл.
Чтобы воспроизвести такой код, я установил 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 сентября, поэтому мне нужно закончить его независимо. Если вы обнаружите какие-либо ошибки или проблемы помимо моей первоначальной проблемы, не стесняйтесь указывать на них и, если можете, объясните мне, почему это неправильно.
Большое спасибо за вашу помощь.