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

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;
    }
}

最佳答案

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


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

关于c - Unix中的轮询功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27393929/

10-09 12:44