LINUX.ORG.RU

История изменений

Исправление xperious, (текущая версия) :

хм, я так понимаю вот такое в case EPOLLIN:

case EPOLLIN  : {
                    char buf[BUFF_DOWNLOAD_SIZE];
                    ::memset(buf, 0, sizeof(buf));
                    int byte_count = 1;
                    while( true ) {
                        byte_count = ::read(evlist[i].data.fd, buf, sizeof(buf));
                        if (byte_count == -1) {
                            //std::cout << "error in read\n";
                            if(errno != EAGAIN) {
                                std::cout << "not EAGAIN\n";
                            }
                            break;
                        }
                        //если клиент закрыл соединение
                        else if(byte_count == 0) {
                            if (epoll_ctl(epfd, EPOLL_CTL_DEL, evlist[i].data.fd, &ev) == -1) {
                                std::cout << "error in delete descriptor from epoll\n";
                                break;
                            }
                            std::cout << "client with descriptor "
                                      << evlist[i].data.fd
                                      << " close connection\n";
                            ::close(evlist[i].data.fd);
                        } else {
                            std::cout << buf;
                        }
                    }
                    }
                    break;
не есть нормальное решение проблемы? т.е. polling который втупую жрет ресурсы(особенно если клиент медленный)... хотя в этом случае хоть блокирующий сокет, хоть нет - все равно качает

такой цикл во многих примерчиках есть(

Исправление xperious, :

хм, я так понимаю вот такое в case EPOLLIN:

case EPOLLIN  : {
                    char buf[BUFF_DOWNLOAD_SIZE];
                    ::memset(buf, 0, sizeof(buf));
                    int byte_count = 1;
                    while( true ) {
                        byte_count = ::read(evlist[i].data.fd, buf, sizeof(buf));
                        if (byte_count == -1) {
                            //std::cout << "error in read\n";
                            if(errno != EAGAIN) {
                                std::cout << "not EAGAIN\n";
                            }
                            break;
                        }
                        //если клиент закрыл соединение
                        else if(byte_count == 0) {
                            if (epoll_ctl(epfd, EPOLL_CTL_DEL, evlist[i].data.fd, &ev) == -1) {
                                std::cout << "error in delete descriptor from epoll\n";
                                break;
                            }
                            std::cout << "client with descriptor "
                                      << evlist[i].data.fd
                                      << " close connection\n";
                            ::close(evlist[i].data.fd);
                        } else {
                            std::cout << buf;
                        }
                    }
                    }
                    break;
не есть нормальное решение проблемы? т.е. polling который втупую жрет ресурсы(особенно если клиент медленный)... хотя в этом случае хоть блокирующий сокет, хоть нет - все равно качает

Исходная версия xperious, :

хм, я так понимаю вот такое в case EPOLLIN:

case EPOLLIN  : {
                    char buf[1024/* * 64*/];
                    ::memset(buf, 0, sizeof(buf));
                    int byte_count = 1;
                    while( true ) {
                        byte_count = ::read(evlist[i].data.fd, buf, sizeof(buf));
                        if (byte_count == -1) {
                            //std::cout << "error in read\n";
                            if(errno != EAGAIN) {
                                std::cout << "not EAGAIN\n";
                            }
                            break;
                        }
                        //если клиент закрыл соединение
                        else if(byte_count == 0) {
                            if (epoll_ctl(epfd, EPOLL_CTL_DEL, evlist[i].data.fd, &ev) == -1) {
                                std::cout << "error in delete descriptor from epoll\n";
                                break;
                            }
                            std::cout << "client with descriptor "
                                      << evlist[i].data.fd
                                      << " close connection\n";
                            ::close(evlist[i].data.fd);
                        } else {
                            std::cout << buf;
                        }
                    }
                    }
                    break;
не есть нормальное решение проблемы? т.е. polling который втупую жрет ресурсы(особенно если клиент медленный)... хотя в этом случае хоть блокирующий сокет, хоть нет - все равно качает