现在我正在为指定的真实服务器编写代理服务器。
系统的体系结构可以通过下图表示:
(我实际上使用多线程来处理所有客户端。)
'客户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等待两个套接字?
答案 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
知道如何处理将要调用它的两个单独的观察者。也许最好有单独的回调函数。