2015-05-13 2 views
0

server.c -> всегда ПРИЕМ данные клиента (используйте опрос(), чтобы подтвердить, произошла ли ошибка)когда делает опрос() возвращает POLLERR

client.c -> всегда посылают данные на сервер

Я EXEC server.c и client.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; 
} 
+0

Возможный дубликат [C++ linux socket revents POLLERR POLLHUP POLLNVAL] (http://stackoverflow.com/questions/24791625/c-linux-socket-handling-revents-pollerr-pollhup-pollnval) – LPs

ответ

0

Это зависит от реализации. Большинство приложений просто обрабатывают POLLERR так же, как и нормальную готовность, позволяя последующей операции терпеть неудачу.

Смежные вопросы