Используя CAsynSocket, как перехватить код завершения операций сокета?

Пожалуйста, кто-то, пожалуйста, помогите мне, как отловить ошибку операции сокета из 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 ()?

0

Решение

Прежде всего, вы не должны смешивать 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;
}
1

Другие решения

Других решений пока нет …