winsock recv()总是返回-1

时间:2017-02-05 21:22:29

标签: tcp winsock recv proxy-server

我正在做一个代理服务器,每当我从这里使用这个rec​​v()循环时:Winsock recv() does not block 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;
}

使用非阻塞套接字调用main的代码:

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

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

有什么理由不退货吗?

1 个答案:

答案 0 :(得分:0)

由于您没有提供nError的值,因此无法确定,但它可能是EWOULDBLOCK,这意味着没有数据,这几乎是不可避免的,因为您有非套接字阻止模式,你没有使用select()并且你在硬循环中阅读。

重构你的接收方法以正确使用非阻塞模式,或保持原样并使用阻塞模式,这似乎是你的意图,无论如何给定代码结构。