2011-04-14 7 views
0

하나의 스레드에서 여러 서버에 여러 개의 tcp 연결을 생성하는 데 libevent를 사용할 수 있습니까? 그러한 작업의 샘플 구현을 작성해 주시겠습니까?libevent 또는 boost :: asio를 사용하여 단일 스레드에서 다중 tcp 연결. 있을 수있다?

내가 그렇게하지만 바로 확인되지 않은 : 또한

... 
int num_of_connect = 5; /*for example*/ 
struct event_base *evbase; 
struct bufferevent *bev[num_of_connect]; 
struct sockaddr_in sin[num_of_connect]; 
evbase = event_base_new(); 

for(int i=0;i<=(num_of_connect-1);i++){ 

    sin[i].sin_family = AF_INET; 
    sin[i].sin_addr.s_addr = inet_addr(/*some addr*/); 
    sin[i].sin_port = htons(/*some port*/); 

    bev[i] = bufferevent_socket_new(evbase, -1, BEV_OPT_CLOSE_ON_FREE); 

    bufferevent_setcb(bev[i], cb_evread, cb_evwrite, cb_event, NULL); 
    bufferevent_socket_connect(bev[i], (struct sockaddr *)&sin[i], sizeof(struct sockaddr_in)); 
} 

event_base_dispatch(evbase); 
... 

는 유사한 부스트 :: ASIO를 사용하여 구현 될 수있다? 예)?

답변

1

boost :: asio를 사용하면 비동기 적으로 연결을 허용하는 스레드에서 실행할 수 있습니다. boost::asio documentation page에는 단일 스레드에서 다중 연결을 허용하는 서버를 설정하는 방법이 나와 있습니다.

저는 당신을 도울 수있는 libevent에 익숙하지 않습니다.

2

또한 비슷하게 boost :: asio를 사용하여 을 구현할 수 있습니까? 예)

예, 전적으로 가능합니다. 이것이 Boost.Asio가 추진 한 프록터 디자인 패턴의 기초입니다. connect, accept, readwrite과 같은 차단 작업을 피함으로써 명시 적 스레드를 사용하지 않고 동시성을 달성합니다. 토니 his answer에서 지적한대로 유용 내 이전 응답의 일부 여기

을 찾을 수는 Boost.Asio 자세히 비동기 개념을 설명하는 훌륭한 예제가 있습니다. 튜토리얼, 특히 asynchronous daytime server도 시작하는 것이 좋습니다.

0

하나의 스레드에서 여러 서버에 여러 개의 TCP 연결을 생성하는 데 libevent를 사용할 수 있습니까? 그러한 작업의 샘플 구현을 작성해 주시겠습니까?

예, 가능합니다.

evconnlistener_new_bind으로 여러 포트에서 수신 한 서버를 만들 수도 있습니다.

하나 이상의 신호를 처리하려는 경우 evsignal_new을 사용하여 이벤트 기반에 신호를 추가 할 수 있습니다. 각각의 경우 (bufferevent_socket_new, evconnlistener_new_bindevsignal_new, 각 이벤트에 대한 콜백 가능성이 다른 것에서는

.