Задать вопрос
@gethighlikeplanes

Ошибки winsock 10054 и 10053. Как решить?

Выдаёт две ошибки 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;

}

клиентские функции идентичны этим двум, только они вне какого-либо класса.
  • Вопрос задан
  • 80 просмотров
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы