2013-09-08 3 views
0

Теперь я пишу прокси-сервер для определения истинного сервера.Как использовать 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_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

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

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 знает, как обращаться с двумя отдельными наблюдателей, что будет вызывать его. Возможно, было бы лучше иметь отдельные функции обратного вызова.

+1

Thx, It works! –