如何在一个事件中使用libev,两个ev_io和ev_watch等待两个套接字?

时间:2013-09-08 09:44:22

标签: c sockets libev

现在我正在为指定的真实服务器编写代理服务器。

系统的体系结构可以通过下图表示:

(我实际上使用多线程来处理所有客户端。)

'客户A'←----- -----→'代理服务器'←----- -----→< strong>'真正的服务器'        


我使用“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等待两个套接字?

1 个答案:

答案 0 :(得分:0)

您需要单独的插座观察器。

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知道如何处理将要调用它的两个单独的观察者。也许最好有单独的回调函数。