poll() 何时返回 POLLERR

Tom*_*Tom 0 c sockets networking tcp polling

server.c-> 总是接收客户端数据(使用 poll() 确认是否发生错误\xef\xbc\x89

\n\n

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

\n\n

我执行server.cclient.c然后我尝试终止client.c进程。

\n\n

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

\n\n

手册页只说

\n\n
\n

POLLERR 错误条件(仅输出)

\n
\n\n

Poll() 什么时候返回 POLLERR?

\n\n

我错过了什么?

\n\n

谢谢。

\n\n

服务器.c

\n\n
#include <stdio.h>\n#include <stdlib.h>\n#include <sys/poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <netinet/in.h>\n#include <errno.h>\n\nint main()\n{\n    int rc = 0;\n    char str[100];\n    char test[5];\n    int listen_fd, comm_fd;\n    struct sockaddr_in servaddr;\n    struct pollfd fds[200];\n    listen_fd = socket(AF_INET, SOCK_STREAM, 0);\n\n    servaddr.sin_family = AF_INET;\n    servaddr.sin_addr.s_addr = htons(INADDR_ANY);\n    servaddr.sin_port = htons(22000);\n\n    bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));\n    listen(listen_fd, 10);\n    comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);\n    fds[0].fd = comm_fd;\n    fds[0].events = POLLIN | POLLOUT | POLLERR | POLLHUP;\n    printf("start\\n");\n\n    while(1) {\n        rc = poll(fds,1,1000);\n        if (rc < 0)\n            printf("failed\\n");\n        else if(rc==0)\n            printf("timeout\\n");\n        else {\n            if (fds[0].revents & POLLERR){\n                printf("Error!!\\n");\n            }\n\n\n            if(fds[0].revents & POLLHUP){\n                printf("handup!!\\n");\n                break;\n            }\n\n            if (fds[0].revents & POLLIN){\n                int bl = recv(comm_fd,test,4,0);\n                printf("recv:%s %d\\n",test,bl);\n            }\n        }\n        sleep(1);\n\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

客户端.c

\n\n
#include <sys/types.h>\n#include <sys/socket.h>\n#include <netdb.h>\n#include <stdio.h>\n#include <string.h>\n\nint main(int argc,char **argv)\n{\n    int sockfd,n;\n    char sendline[100];\n    char recvline[100];\n    struct sockaddr_in servaddr;\n\n    sockfd=socket(AF_INET,SOCK_STREAM,0);\n    bzero(&servaddr,sizeof servaddr);\n\n    servaddr.sin_family=AF_INET;\n    servaddr.sin_port=htons(22000);\n\n    inet_pton(AF_INET,"127.0.0.1",&(servaddr.sin_addr));\n\n    connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));\n    while(1){\n        send(sockfd,"test",4,0); \n        sleep(5);\n    } \n    close(sockfd);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Dav*_*rtz 5

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