Я боролся с тем, как это сделать. Я нашел информацию в Интернете, как делать чтение, и как писать, но я смущен, как делать чтение и письмо. Нужно ли мне запускать два цикла базы событий? Или я могу как-то использовать? Вот пример кода для отправки, который я нашел в Интернете, например (функции обратного вызова опущены):
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);
Во-первых, вы должны использовать bufferevent_write()
вместо нижнего уровня evbuffer_add_printf()
- первый - более чистый, и базовый evbuffer может быть заморожен.
Вы также отключите обратные вызовы чтения и записи - так что вы не получите обратный вызов, когда сможете читать из вашего буфериза. Внесите хотя бы ваш обратный вызов и установите его через bufferevent_setcb()
. Вероятно, именно поэтому вы ничего не видите.
Затем, вероятно, вы либо:
bufferevent_write()
когда подключено - используйте bufferevent_write()
когда вы получите связанное событие (BEV_EVENT_CONNECTED
) в вашем eventcb
.