Linux 我对以下在POSIX中使用轮询函数的代码感到困惑

Linux 我对以下在POSIX中使用轮询函数的代码感到困惑,linux,Linux,下面的代码是一个TCP服务器 bool Run() { bool result = false; m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALIDE_SOCKET == m_Socket) { printf("Invalide socket..."); return result; } sockaddr_in servAddr

下面的代码是一个TCP服务器

bool Run()
{   
    bool result = false;
    m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (INVALIDE_SOCKET == m_Socket)
    {
        printf("Invalide socket...");
        return result;
    }

    sockaddr_in servAddr;
    unsigned int sockAddrSize = sizeof(sockaddr_in);
    bzero(&servAddr, sockAddrSize);
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(m_Port);

    if (0 != bind(m_Socket, (sockaddr *)&servAddr, sockAddrSize))
    {
        printf("Can not bind socket addres to socket file...\n");
        return result;
    }

    if (0 != listen(m_Socket, MAX_CONNECTION))
    {
        printf("Can not listen socket...\n");
        return result;
    }


    printf("Server is stared. Please enter any key to continue...\n");
    getchar();
    system("clear");

    m_Listener.Start();
    m_DataReader.Start();

    sockaddr_in temp;
    while (true)
    {
        bzero(&temp, sockAddrSize);
        int tempSocket = accept(m_Socket, (sockaddr *)&temp, &sockAddrSize);

        if (-1 == tempSocket)
        {
            printf("accept is fialed...\n");
        }
        else
        {
            printf("A connection is established!\n");
        }

        //This is my intention:blocking after the client is connected and before the client to be send any data. 
        //When the client sends data, the program will print '---------------'.
        pollfd tempTest;
        tempTest.events = POLLRDNORM;
        tempTest.revents = 0;
        tempTest.fd = tempSocket;

        int pollRes = poll(&tempTest, 1, -1);
        if (pollRes == 1 && POLLRDNORM == tempTest.revents)
        {
          printf("-------------------\n");
        }

    }
    return  result;
}
事实上,当客户端连接到服务器并且不发送任何数据时,以下代码不符合我的意图,因为它也没有被阻止和打印“---------------”:

    //This is my intention:blocking after the client is connected and before the client to be send any data. 
    //When the client sends data, the program will print '---------------'.
    pollfd tempTest;
    tempTest.events = POLLRDNORM;
    tempTest.revents = 0;
    tempTest.fd = tempSocket;

    int pollRes = poll(&tempTest, 1, -1);
    if (pollRes == 1 && POLLRDNORM == tempTest.revents)
    {
      printf("-------------------\n");
    }
你看过手册了吗

您应该测试
poll的结果
so代码:

fflush(NULL);
int res = poll(&test, 1, -1);
if (res < 0) {
  perror("poll");
  exit(EXIT_FAILURE); /// or some other error handling
};
printf("poll gave %d\n", res);
fflush(空);
int res=轮询和测试,1,-1);
如果(res<0){
佩罗(“投票”);
exit(exit_FAILURE);///或其他一些错误处理
};
printf(“投票结果为%d\n”,res);
顺便说一句,我会在轮询之前调用,我会打印
poll
的结果,至少出于调试目的

您当然希望在成功的
轮询后处理
folfd.revents
;您应该特别注意它是
POLLNVAL
还是
POLLERR

你也应该进行同样的测试(你应该在
poll
ing之前进行测试,看看,也许或者;我想这就是
poll
失败或者说
POLLNVAL
或者
POLLERR
!)


阅读

这显然不是你真正的代码。由于未定义
folfd
,因此此文件甚至无法编译。请在所有错误情况下使用
perror
。谢谢您的回答。我一直在消除困惑。