Winsock recv() 总是返回 -1


嗨,我

正在做代理服务器,每当我从这里使用此 recv(( 循环时:Winsock recv(( 不会阻塞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
}

有什么理由不返回任何东西吗?

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

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

相关内容

  • 没有找到相关文章

最新更新