recvfrom () ошибка 10035 с использованием неблокирующих сокетов
Я использую функцию ioctlsocket (), чтобы сделать мой сокет неблокирующим, но когда я вызываю recvfrom (), я получаю ошибку 10035 (WSAEWOULDBLOCK
).
u_long mode = 1;
ioctlsocket(newSocketIdentifier, FIONBIO, &mode);
while(1)
{
if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
{
char err[128];
itoa(WSAGetLastError(),err,10);
MessageBox( NULL,"Could not Receive Data",err,MB_ICONINFORMATION);
BREAK;
}
}
может кто-нибудь объяснить, почему это происходит? :(
1 ответов
это нормально, если нет данных. Код WSAEWOULDBLOCK (см. эту таблицу) и означает, что на блокирующем порту функция должна сидеть и ждать, пока она не будет обслуживаться.
while(1)
{
if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
{
int ierr= WSAGetLastError();
if (ierr==WSAEWOULDBLOCK) { // currently no data available
Sleep(50); // wait and try again
continue;
}
// Other errors
char err[128];
itoa(ierr,err,10);
MessageBox( NULL,"Could not Receive Data",err,MB_ICONINFORMATION);
break;
}
}