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

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

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);

0

Решение

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

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

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

  • Хотите отправить что-то одноранговому при подключении — используйте bufferevent_write() когда вы получаете подключенное событие (BEV_EVENT_CONNECTED) в вашем eventcb Перезвоните.
  • Ожидайте получить что-то от однорангового узла после подключения — в этом случае будет вызван ваш обратный вызов чтения.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]