URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2882
[ Назад ]

Исходное сообщение
"ф-ция poll"

Отправлено Povesa , 04-Май-04 01:53 
Здраствуйте. Я новичок в сетевом программировании и у меня возник такой трабл: почему ф-ция poll не можте отследить разрыв канала, а вместо этого определяет поступления новых данных на сокет(тобишь POLLIN)
struct pollfd fds[1];

int main(void)
{
    struct sockaddr_in addr;
    int value=1;int cl=1,result,k,addr_len=sizeof(addr),sd;
    char buffer[256];
    int bytes;
    sd = socket(PF_INET, SOCK_STREAM, 0);
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.s_addr = INADDR_ANY;
    if ( bind(sd, (struct sockaddr *)&addr, sizeof(addr)) == 0 )
    {
                listen(sd,5);
        fds[0].fd=accept(sd,0,0);
        fds[0].events=POLLIN;
        for (;;)
        {
        if ( (result = poll(fds, 1, 500)) > 0 )
        {   int i;
        if ((fds[0].revents & POLLHUP)==POLLHUP)
                {    
                close(fds[0].fd);
                bzero(&fds[0], sizeof(fds[0]));
                }
            if ( (fds[0].revents & POLLIN)==POLLIN )
            {
            if(recv(fds[0].fd, buffer, sizeof(buffer), 0)>0)
                {
                puts(buffer);
                if((fds[0].revents & POLLOUT)==POLLOUT)             send(fds[0].fd, buffer, bytes, 0);
                    }
                }
        }
        else if ( result < 0 )
            {perror("poll() error");exit(0);}
        }
    }
return 0;
}

Это простой эхо-сервер. Почему он не работает как нада при разрыве соединения??


Содержание

Сообщения в этом обсуждении
"ф-ция poll"
Отправлено genie , 04-Май-04 04:58 
Potomu chto ono tak rabotaet - esli recv() vernul 0, znachit soedinenie razorvano.