Как использовать libev для одного события, ожидая два сокета двумя ev_io и ev_watch?

Теперь я пишу прокси-сервер для указанного истинного сервера.

Архитектуру системы можно представить в виде графика ниже:

(На самом деле я использую многопоточность для обработки всех клиентов.)

'клиент A' ←––––– –––––→ 'прокси-сервер' ←––––– –––––→ ' настоящий сервер"


Я использую "libev.h" для его реализации, поэтому одно событие должно прослушивать два сокета.

Я нахожу пример вроде:

struct MYIO w
{
    ev_io io;
    int serverfd;
    int clientfd;
}

int main()
{

    ...

    struct MYIO w;

    w.clientfd = new_tcp_client ("127.0.0.1", 12346);

    ev_io_init (&w.io, client2proxy_func, clientfd, EV_READ);
    ev_io_start (loop, &w_io);

    ev_timer_init (&timeout_watcher, timer_func, 5, 0.);
    ev_timer_start (loop, &timeout_watcher);

    ...

}

Это только для одного события io.

Если я хочу подождать два io_ev, то это не сработает... как показано ниже:

(Я также пробовал по-другому, но все потерпело неудачу.)

...

w.clientfd = new_tcp_client ("127.0.0.1", 12346);
w.serverfd = new_tcp_server ("127.0.0.1", 12345);

ev_io_init (&w.io, client2proxy_func, clientfd, EV_READ);
ev_io_start (loop, &w_io);
ev_io_init (&w.io, proxy2server_func, serverfd, EV_READ);
ev_io_start (loop, &w_io);

ev_timer_init (&timeout_watcher, timer_func, 5, 0.);
ev_timer_start (loop, &timeout_watcher);

...

Как использовать libev в многозадачности?

Как использовать libev для одного события, ожидая два сокета двумя ev_io и ev_watch?


person Kir Chou    schedule 08.09.2013    source источник


Ответы (1)


Вам понадобятся отдельные наблюдатели для сокетов.

struct MYIO w
{
    ev_io io_server;
    ev_io io_client;
    int serverfd;
    int clientfd;
}

...

w.serverfd = new_tcp_server ("127.0.0.1", 12345);
w.clientfd = new_tcp_client ("127.0.0.1", 12346);

ev_io_init (&w.io_server, client2proxy_func, w.serverfd, EV_READ);
ev_io_start (loop, &w.io_server);
ev_io_init (&w.io_client, client2proxy_func, w.clientfd, EV_READ);
ev_io_start (loop, &w.io_client);

...

Убедитесь, что client2proxy_func знает, как обращаться с двумя отдельными наблюдателями, которые будут его вызывать. Возможно, было бы лучше иметь отдельные функции обратного вызова.

person James Chong    schedule 08.09.2013