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;
      }
   }