Выдаёт две ошибки winsock на localhost'е при отправке файла(размер которого 1,34 МБ и более):10054(на сервере) и 10053(на клиенте).
Извинясь за фекалиеподобный код.
функции отправки и принятия файла:
//sends file to socket
int server::send_file_func(const std::string& file_name, SOCKET sock)
{
std::ifstream file(file_name, std::ios::binary);
if (!file.is_open())
{
//file is not opened
return -1;
}
uint64_t file_size = std::filesystem::file_size(file_name);
bool errored = false;
char buffer[BUFFER_SIZE];
int i = 0;
int n = send(sock, reinterpret_cast<char*>(&file_size), sizeof(file_size), 0);
if (n < 0)
{
//send failed
return -2;
}
while (i < file_size)
{
int size = std::min<int>(BUFFER_SIZE, file_size - i);
if (!file.read(buffer, size))
{
errored = true;
break;
}
n = send(sock, buffer, size, 0);
if (n < 0)
{
std::cout << "server::recv_file_func() Send() error: " << WSAGetLastError() << "\n";
errored = true;
break;
}
i += n;
}
file.close();
return errored ? -3 : i;
}
//accept a file
int server::recv_file_func(const std::string& file_name, SOCKET sock)
{
std::ofstream file(file_name, std::ios::binary);
if (!file.is_open())
{
//file is not opened
return -1;
}
uint64_t file_size = 0;
bool errored = false;
char buffer[BUFFER_SIZE];
int i = 0;
int n = recv(sock, reinterpret_cast<char*>(&file_size), sizeof(file_size), 0);
if (n < 0)
{
//recv failed
return -2;
}
while(i != file_size)
{
int size = std::min<int>(BUFFER_SIZE, file_size - i);
n = recv(sock, buffer, size, 0);
if (n < 0)
{
std::cout << "server::recv_file_func() recv() error: " << WSAGetLastError() << "\n";
errored = true;
break;
}
else if(n == 0)
{
std::cout << "connection closed" << "\n";
errored = true;
break;
}
std::cout << "bytes recv: " << n << "\n";
i += n;
if(!file.write(buffer, n))
{
errored = true;
break;
}
}
file.close();
return errored ? -3 : i;
}
клиентские функции идентичны этим двум, только они вне какого-либо класса.