Пожалуйста, кто-то любезно поможет мне, как поймать ошибку операции сокета из класса CAsyncSocket.Использование CAsynSocket, как убрать код выхода сокетов?
Если я это сделать:
int iLen = recv(socket, socketBuffer, sizeBuffer, 0);
if(iLen==SOCKET_ERROR) {
//handle error here
} else {
//do something with the received data
}
Он всегда возвращает ошибку, которая WSAEWOULDBLOCK
, и то же самое для другой операции, как Send(), Connect(), и т.д. ...
Согласно MSDN , это не фатальная ошибка, и для завершения действий должно пройти некоторое время.
Итак, как я могу проверять каждый раз, когда моя программа правильно выполнила recv() или send()?
Последний аргумент [ 'recv'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121 (v = vs.85) .aspx) - это значение флага целого числа *, а не указатель. Поэтому вы не должны использовать 'NULL'. –
Что касается вашей проблемы, 'WSAEWOULDBLOCK' просто говорит вам, что в * неблокирующем * соке нет ничего. Вы можете использовать ['select'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms740141 (v = vs.85) .aspx) или [' WSAPoll'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms741669(v=vs.85).aspx), чтобы опросить, есть ли сокет (ы) для чтения. –
Спасибо за ваш комментарий, в MFC они определяют NULL как 0; однако, я действительно редактировал свой код в качестве вашего предложения. Для select() я до сих пор не знаю, как его использовать. –