unix中的轮询功能

时间:2014-12-10 05:32:27

标签: c unix polling

我正在尝试使用poll函数使客户端接受来自服务器的输入并将其打印出来,或接受来自键盘的输入并将其发送到服务器。输出具有承载来自服务器的信息的套接字的文件描述符,但我不知道应该将哪个文件描述符赋予pollfd结构的输入(从键盘接受输入的部分)。现在我给他们两个提供了相同的文件描述符。这是我的客户代码:

void error(const char *msg)
{
    perror(msg);
    exit(0);
}


void chat( int sockfd)
{

    struct pollfd thing[2];

    thing[0].fd = sockfd;
    thing[0].events = POLLRDNORM | POLLERR;
    thing[0].revents = 0;
    thing[1].fd = sockfd;
    thing[1].events = POLLERR | POLLWRNORM;
    thing[1].revents = 0;
    char buffer[256];
    int n;

    while(strcmp(buffer, "quit")!=0)
    {
       int r = poll(thing, 2, 1000);
       if(r<0)
       {
         perror("poll");
         sleep(1);}

        bzero(buffer, 256);
        if(thing[0].revents & POLLRDNORM)
        {
           n = read(sockfd,buffer,255);
           if (n < 0)
              error("ERROR reading from socket");
           printf("the message is : %s\n",buffer);
         }


        else if(thing[1].revents & POLLWRNORM)
        { bzero(buffer, 256);
          fgets(buffer,255,stdin);
          n = write(sockfd,buffer,strlen(buffer));
          if (n < 0)
             error("ERROR writing to socket");}
        else continue;
    }
}

1 个答案:

答案 0 :(得分:0)

  

我不知道应该将哪个文件描述符赋予输入   pollfd结构(接受键盘输入的部分)。

如果键盘已连接到stdin,您可以使用STDIN_FILENO中的<unistd.h>以及0