2017-02-05 8 views
-1

Привет, я делаю прокси-сервер и всякий раз, когда я использую этот цикл recv(): Winsock recv() does not block Функция recv() всегда возвращает -1, поэтому она выходит из цикла и никогда не попадает получать что угодно.winsock recv() всегда возвращает -1

int System::receive(SOCKET &recvSocket) 
{ 
    char buffer[4096] = { 0 }; 
    int numBytes; 


    do { 
     numBytes = recv(recvSocket, buffer, 4095, 0); 
     //lastReceived = lastReceived + buffer; 
     //get recent contents of buffer 
     cout << numBytes << endl; 
     if (numBytes > 0) 
     { 
      cout << buffer << endl; 
      continue; 
     } 

     if (numBytes == 0) 
     { 
      std::cout << "Client disconnected!" << std::endl; 
      break; 
     } 

     int nError = WSAGetLastError(); 
     cout << nError << endl; 
     if (nError != WSAEWOULDBLOCK) 
     { 
      std::cout << "Winsock error code: " << nError << std::endl; 
      break; 
     } 


    } while (1); 

    return numBytes; 
} 

вызова кода в основном с неблокирующей розеткой:

SOCKET establishedConn = Server.acceptSocket(listenSocket); 
u_long iMode = 1; 
if (establishedConn != NULL) { 

    ioctlsocket(establishedConn, FIONBIO, &iMode); 
    Server.receive(establishedConn); //receive request from client 
} 

Есть ли причина, почему его ничего не возвращает?

ответ

0

Как вы еще не указали значение nError, невозможно быть уверенным, но это, вероятно, EWOULDBLOCK, то есть нет данных, что почти неизбежно, учитывая, что у вас есть сокет в неблокирующем режиме, и вы не используют select(), и вы читаете жесткий цикл.

Либо реструктурируйте свой метод приема, чтобы правильно использовать режим блокировки, либо оставьте его как есть, и используйте режим блокировки, который, кажется, является вашим намерением в любом случае с учетом структуры кода.