poll()什么时候返回POLLERR

时间:2015-05-13 07:06:05

标签: c sockets networking tcp polling

server.c - >总是recv客户端数据(使用poll()来确认是否发生错误)

client.c - >总是将数据发送到服务器

我执行server.cclient.c,然后我尝试杀死client.c进程。

但POLLERR标志永远不会被设置。

手册页只说

  

POLLERR错误条件(仅输出)

Poll()什么时候返回POLLERR?

我错过了什么?

感谢。

server.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/poll.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <errno.h>

int main()
{
    int rc = 0;
    char str[100];
    char test[5];
    int listen_fd, comm_fd;
    struct sockaddr_in servaddr;
    struct pollfd fds[200];
    listen_fd = socket(AF_INET, SOCK_STREAM, 0);

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htons(INADDR_ANY);
    servaddr.sin_port = htons(22000);

    bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
    listen(listen_fd, 10);
    comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
    fds[0].fd = comm_fd;
    fds[0].events = POLLIN | POLLOUT | POLLERR | POLLHUP;
    printf("start\n");

    while(1) {
        rc = poll(fds,1,1000);
        if (rc < 0)
            printf("failed\n");
        else if(rc==0)
            printf("timeout\n");
        else {
            if (fds[0].revents & POLLERR){
                printf("Error!!\n");
            }


            if(fds[0].revents & POLLHUP){
                printf("handup!!\n");
                break;
            }

            if (fds[0].revents & POLLIN){
                int bl = recv(comm_fd,test,4,0);
                printf("recv:%s %d\n",test,bl);
            }
        }
        sleep(1);

    }
    return 0;
}

client.c

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>

int main(int argc,char **argv)
{
    int sockfd,n;
    char sendline[100];
    char recvline[100];
    struct sockaddr_in servaddr;

    sockfd=socket(AF_INET,SOCK_STREAM,0);
    bzero(&servaddr,sizeof servaddr);

    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(22000);

    inet_pton(AF_INET,"127.0.0.1",&(servaddr.sin_addr));

    connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
    while(1){
        send(sockfd,"test",4,0); 
        sleep(5);
    } 
    close(sockfd);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

它依赖于实现。大多数应用程序只将POLLERR视为正常就绪状态,从而使后续操作失败。