Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу удалить событие из мониторинга. libevent, event_del() 
:(
    Опции темы
fray
  Дата 8.4.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



Делаю так, запускаю цикл добавляю два события, потом после того как читаю из сокета, пытаюсь удалить event_del() событие из мониторинга, но оно не удаляется объясните плизз, в чём дело ?
тут цикл тормозиться так как после почтения с делаю close(fd), но event_dispatch(); не завершается так как события не были удалены.
Код


struct client {  
        struct event ev_read;
        struct event ev_write;
};

int setnonblock(int fd);

int make_connect (int srv_sck) {
    if( connect(srv_sck, (struct sockaddr *)&sa, sizeof(sa)) == -1 )  {
        fprintf(stderr, "Can't connect to port %d .\n", 80);
        close(srv_sck);
        return -1;
    }
  return 1;
}

void on_read(int fd, short ev, void *arg) {

            struct client *client = (struct client *)arg;
            perror("Read");
            char buf[8196];
            memset(buf, 0, 8196);

        if (read(fd, buf, sizeof(buf)) > 0) {
          if (!event_del(&client->ev_read) )
                      perror("\tYap ev_write was deleted");
                  else       
              perror("can't delete ev_read");

                  close(fd);
                  free(client);
                  return;
            }
}

void on_write(int fd, short ev, void *arg) {
            struct client *client = (struct client *)arg;
        perror("Write");
        char http_request[2048];
        memset(http_request, 0, 2048);
        strcpy(http_request, "GET / HTTP/1.0\r\n\r\n");  

        if (write(fd, http_request, strlen(http_request)) > 0 ) {
            if (!event_del(&client->ev_write) )
               perror("\tYap ev_write was deleted");
            else 
               perror("can't delete ev_write");

            return;
         }
}


int main(int argc, char **argv) {

        struct hostent *hptr;
        static char *host = "localhost";

        if( (hptr = gethostbyname(host)) == NULL) {
            fprintf(stderr, "Can't get host %s .\n", host);
            return 1;
        }
        int port = 80;
        sa.sin_family = AF_INET;
        sa.sin_port = htons(port);
        memcpy((char*)&sa.sin_addr.s_addr, (char*)hptr->h_addr, hptr->h_length);
        
        event_init(); // libevent init

        int srv_sck; 
        int reuseaddr_on = 1;
        struct event ev_read, ev_write; 

        if ( (srv_sck = socket( AF_INET, SOCK_STREAM, 0 )) == -1 ) perror("socket");
        
        if (setsockopt(srv_sck, SOL_SOCKET, SO_KEEPALIVE, &reuseaddr_on, sizeof(reuseaddr_on)) == -1) perror("setsockopt");
        

        make_connect(srv_sck);

        if (setnonblock(srv_sck) < 0) perror("setnonblock");

        struct client * client = calloc(1, sizeof(*client));

        event_set(&ev_read, srv_sck, EV_READ|EV_PERSIST, on_read, client);
        event_add(&ev_read, NULL);


        event_set(&ev_write, srv_sck, EV_WRITE|EV_PERSIST, on_write, client);
        event_add(&ev_write, NULL);

        event_dispatch();     

        return 0;
}

int setnonblock(int fd) {
        int flags;
        flags = fcntl(fd, F_GETFL);
        if (flags < 0)
                return flags;
        flags |= O_NONBLOCK;
        if (fcntl(fd, F_SETFL, flags) < 0)
                return -1;

        return 0;
}





Это сообщение отредактировал(а) fray - 8.4.2008, 18:09
PM MAIL   Вверх
fray
  Дата 8.4.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 7.6.2007

Репутация: нет
Всего: 0



shutdown() помог, но как-то это не красиво.   smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.