Теперь я пишу прокси-сервер для указанного истинного сервера.
Архитектуру системы можно представить в виде графика ниже:
(На самом деле я использую многопоточность для обработки всех клиентов.)
'клиент 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?