Как использовать libusb с libevent?

#c #c #libusb #libevent #libusb-1.0

#c #c #libusb #libevent #libusb-1.0

Вопрос:

Я пишу приложение, управляемое событиями, с использованием libevent, и мне нужно выполнить передачу данных по USB с использованием libusb-1.0.

Я хотел использовать libusb_get_pollfds, чтобы получить список дескрипторов файлов (в fds ) и добавить их в libevent следующим образом:

 const struct libusb_pollfd **fds = libusb_get_pollfds(device->context);

const struct libusb_pollfd *it = *fds;
for(;it != NULL;   it) {
    cout << "Adding fd: " << it->fd << ", " << it->events << endl;
    struct event * ev = event_new(base_, 
        it->fd, it->events | EV_PERSIST, 
        callbacks::libusb_cb, this);
    event_add(ev, 0);
    libusb_fds_events.insert(std::make_pair(it->fd, ev));
}

free(fds);

// (...)

// And the callback function:
void callbacks::libusb_cb(evutil_socket_t fd, short what, void *arg) {
    Server *s = reinterpret_cast<Server*>(arg);
    libusb_handle_events_timeout(s->device_->context, 0);
}
  

Кроме того, я использую libusb_set_pollfd_notifiers для добавления / удаления fds из libusb_fds_events .

Проблема в том, что я получаю много странных fds в списке, возвращаемом libusb (например, я получаю stdin (!) много раз, когда событие равно 0).

Правильно ли я его использую?

Ответ №1:

Я обнаружил ошибку в коде. Это должно было быть:

 const struct libusb_pollfd **it = fds;
for(;*it != NULL;   it) {
    cout << "Adding fd: " << (*it)->fd << ", " << (*it)->events << endl;
    struct event * ev = event_new(base_, 
        (*it)->fd, (*it)->events | EV_PERSIST, 
        callbacks::libusb_cb, this);
    event_add(ev, 0);
    libusb_fds_events.insert(std::make_pair((*it)->fd, ev));
}