@daniil14056

Зависает при recv c++ winsock2?

В цикле читаю в буфер данные, когда все данные полученны уже, то есть предпоследний вызов вернул 1-10 байтов, она вызывается сного так как reads_bytes>0 , а там читать уже не чего, и прога зависает, как выйти из цикла?
while ((reads_bytes = c->recv(buf, len)) > 0) {
			 std::cout.write(buf, reads_bytes);	
			// if (reads_bytes<len) break; // можно так но подозрительно
		 }
/////////////////////////////////////////////////////////////////////////////////
int Socket::recv(char * buf, int  len)
{
	int read_bytes = ::recv(this->socket_id, buf, len, 0); // зависает после того как читать не чего, но она зупустилась уже
	if (read_bytes ==SOCKET_ERROR) {
		close();
		error("recv failed "+ WSAGetLastError());
	}
	if (read_bytes == 0) {
		close();
		return -1;
	}
	return read_bytes;
}
  • Вопрос задан
  • 273 просмотра
Пригласить эксперта
Ответы на вопрос 1
15432
@15432
Системный программист ^_^
Нуу вот различные варианты:
1) установить таймаут на прием
2) переписать на неблокирующие сокеты
3) не принимать лишнего (принимать заголовок, смотреть сколько размер данных, принимать данные ровно нужного размера)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы