Пример того, как сделать чтение и запись между двумя конечными точками с помощью libevent?

0

Я боролся с тем, как это сделать. Я нашел информацию в Интернете, как делать чтение, и как писать, но я смущен, как делать чтение и письмо. Нужно ли мне запускать два цикла базы событий? Или я могу как-то использовать? Вот пример кода для отправки, который я нашел в Интернете, например (функции обратного вызова опущены):

int err;

#ifdef _WIN32
    WORD wVersionRequested;
    WSADATA wsaData;

    /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup(wVersionRequested, &wsaData);

    if (err != 0) {
        /* Tell the user that we could not find a usable */
        /* Winsock DLL.                                  */
        printf("WSAStartup failed with error: %d\n", err);
        return false;
    }
#endif

    struct event_base *base;
    struct bufferevent *bev;
    struct sockaddr_in sin;

    base = event_base_new();

    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(0x7f000001); /* 127.0.0.1 */
    sin.sin_port = htons(22346); 

    bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);

    bufferevent_setcb(bev, NULL, NULL, eventcb, NULL);
    bufferevent_enable(bev, EV_READ|EV_WRITE);

    evbuffer_add_printf(bufferevent_get_output(bev), "WOOOOOOOOOOOOOO");

    if (bufferevent_socket_connect(bev,
        (struct sockaddr *)&sin, sizeof(sin)) < 0) {
        /* Error starting connection */
        bufferevent_free(bev);
        return -1;
    }

    event_base_dispatch(base);
Теги:
networking
tcp
libevent

1 ответ

0

Во-первых, вы должны использовать bufferevent_write() вместо нижнего уровня evbuffer_add_printf() - первый - более чистый, и базовый evbuffer может быть заморожен.

Вы также отключите обратные вызовы чтения и записи - так что вы не получите обратный вызов, когда сможете читать из вашего буфериза. Внесите хотя бы ваш обратный вызов и установите его через bufferevent_setcb(). Вероятно, именно поэтому вы ничего не видите.

Затем, вероятно, вы либо:

  • Хотите отправить что-то bufferevent_write() когда подключено - используйте bufferevent_write() когда вы получите связанное событие (BEV_EVENT_CONNECTED) в вашем eventcb.
  • Ожидайте получить что-то от однорангового узла после подключения - в этом случае будет вызван ваш обратный вызов.
  • 0
    Я понимаю необходимость реализации обратного вызова read, я просто хотел опубликовать пример для записи. Нужно ли создавать два буфера-буфера, один для чтения и один для записи? Это основная часть, в которой я запутался. Мое понимание TCP не так уж велико, но я думаю, что мне понадобятся два соединения сокетов, верно?
  • 0
    Нет, вам нужен один сокет и один bufferevent. Вы можете писать в него для отправки данных, а когда вызывается обратный вызов чтения, вы можете читать из него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню