Пожалуйста, кто-то, пожалуйста, помогите мне, как отловить ошибку операции сокета из CAsyncSocket Class.
Если я сделаю это:
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 ()?
Прежде всего, вы не должны смешивать CAsyncSocket API а также Berkley Socket API.
Ваш OnReceive
Обработчик должен выглядеть так:
CByteArray InBuffer;
InBuffer.SetSize(DEFAULT_RX_BUFFER_SIZE);
int nBytes = Receive(InBuffer.GetData(), (int)InBuffer.GetSize());
switch (nBytes)
{
case 0:
ShutDown(CAsyncSocket::both);
break;
case SOCKET_ERROR:
if (::GetLastError() != WSAEWOULDBLOCK)
ShutDown(CAsyncSocket::both);
else
AsyncSelect();
break;
default:
{
// TODO: data processing goes here
}
break;
}
Других решений пока нет …