2011-05-02 2 views
1

libevent를 사용하여 이벤트 기반 응용 프로그램을 작성 중이며 libusb-1.0을 사용하여 USB 전송을 수행해야합니다. libevent를 libusvent와 함께 사용하는 방법은 무엇입니까?

나는 이런 식으로 libevent하기 ( fds에서) 파일 기술자의 목록을 얻으려면 libusb_get_pollfds를 사용하여 추가하고 싶었 :

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_fds_events에서 FDS를 추가/제거 할 libusb_set_pollfd_notifiers를 사용합니다.

문제는 libusb에 의해 반환 된 목록에서 많은 이상한 fds가 발생한다는 것입니다 (예 : stdin (!) 여러 번 이벤트가 0 인 경우).

올바른 방법으로 사용하고 있습니까?

답변

3

코드에서 오류가 발생했습니다. 다음과 같아야합니다.

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)); 
} 
관련 문제