분리하고 코드를 다시 연결 샘플 코드를 지원하도록 수정 쓰기 비동기 클라이언트를 밀어

계정에 부스트 산업 강도 따라서 직접 사용을 복용 공식 샘플 주소 코드 : HTTPS : //www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/examples/cpp11_examples.html

적은 코드, 높은 안정성, 높은 속도를 사용하기가 매우 편리합니다.

나중에 실제 과정은, 같은 클라이언트 처음 시작할로 연결 생활 지원 기능을 분리 서버도 클라이언트까지 서버까지 희망이 즉시 시작하는 희망. 네트워크의 변동의 경우에, 클라이언트는 단선까지 연결된 직후에 다시 연결 모른다.

연구가 성공하면 비동기 연결이, () do_read_header을 수행 할 때, 그 다음 do_connect 수 있습니다 성공하지 못한 것을 발견 한 후 원래의 샘플 코드는, 위의 두 가지 기능을 달성 할 수

단선이 발생할 때 제공된 is_connected_ 클래스의 연결 식별자, 상기 접속 ID가 false로 설정되어,이 외부 식별자를 계속 검출, 식별 오류가 발견되면, 클라이언트는 전체를 다시 시작할 수

전체 코드의 수정, 당신은 다운로드 할 수있는 웹 사이트 테스트 서버의 시작 부분으로 이동해야합니다 :

// 
// chat_client.cpp
 // ~~~~~~~~~~~~~~~
 // 
// 저작권 (C) 2,003에서 2,013 사이 크리스토퍼 M. Kohlhoff (크리스 kohlhoff 닷컴에서)
 // 
// 부스트 소프트웨어 라이센스, 버전 1.0에서 분산. (동반 참조
 //의 파일 LICENSE_1_0.txt 또는에서 복사 http://www.boost.org/LICENSE_1_0.txt )
 //  https://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/ 예 / cpp11_examples.html 

사용법 #include <cstdlib> 
사용법 #include <양단 큐> 
사용법 #include <iostream> 
사용법 #include <실> 
사용법 #include <부스트 / asio.hpp> 
사용법 #include "chat_message.hpp은 " 

사용하여 부스트 : ASIO :: IP : TCP를, 

타입 정의 표준을 :: 양단 큐 <chat_message> chat_message_queue, 

클래스 chat_client 
{ 
공개 : 
    chat_client을 (:: 부스트 ASIO :: io_serviceio_service, 
        TCP :: 해결 :: 반복자 endpoint_iterator) 
        : io_service_ (io_service) 
        socket_ (io_service) 
    { 
        is_connected_ = 거짓 ; 
        do_connect (endpoint_iterator) 
    } 

    공극 쓰기 ( CONST chat_message 및 MSG) 
    { 
        io_service_.post (
            [ , MSG () 
        { 
            부울 write_in_progress =! write_msgs_.empty (); 
            (MSG) write_msgs_.push_back; 
            만약 (! write_in_progress) 
            { 
                do_write (); 
            } 
        }); 
    } 

    공극 확대 () 
    { 
        io_service_.post ([ () {close_socket ();}); 
    } 

    BOOL get_connected () CONST {
         반환 is_connected_; 
    } 

개인 :
     무효 do_connect (TCP : 해결 :: 반복자 endpoint_iterator) 
    {
        부스트 : ASIO :: async_connect (socket_, endpoint_iterator, 
            [ , endpoint_iterator (부스트 : 시스템 : ERROR_CODE EC, TCP : 리졸버 :: 반복자) 
        { 
            경우 (! EC) 
            { 
                is_connected_ = ; 
                do_read_header (); 
            } 
            다른 { 
                do_connect (endpoint_iterator); 
            } 
        }); 
    } 

    공극 do_read_header는 () 
    {  
        부스트 : ASIO :: async_read을 (socket_,
            부스트 : ASIO :: 버퍼 (read_msg_.data () chat_message :: header_length) 
            [ (부스트 :: 시스템 :: ERROR_CODE EC, 표준 : : size_t로 / * 길이 * / ) 
        { 
            경우 (EC &&! read_msg_.decode_header ()) 
            { 
                do_read_body (); 
            } 
            다른 
            { 
                close_socket (); 
            } 
        }); 
    } 

    공극 close_socket () 
    { 
        socket_.close (); 
        is_connected_ = 거짓 ; 
    } 

    무효는  do_read_body ()
    { 
        부스트 : ASIO :: async_read을 (socket_,
            부스트 : ASIO :: 완충액 (read_msg_.body () read_msg_.body_length ()) 
            [  (부스트 : 시스템 : ERROR_CODE EC, 표준 :이 size_t / * 길이 * / ) 
        { 
            경우 (! EC) 
            { 
                표준 : cout.write (read_msg_.body (), read_msg_.body_length ()); 
                표준 : COUT << " \ n을 " ; 
                do_read_header (); 
            } 
            다른 
            { 
                close_socket (); 
            } 
        }); 
    } 

    무효  do_write ()
    { 
        부스트 : ASIO :: async_write을 (socket_, 
            부스트 : ASIO :: 버퍼 (write_msgs_.front (). 데이터 () 
                write_msgs_.front을 (). 길이 ()) 
            [  (부스트 : 시스템 : ERROR_CODE EC, 표준 : : size_t로 / * 길이 * / ) 
        { 
            경우 (! EC) 
            { 
                write_msgs_.pop_front (); 
                경우 (! write_msgs_.empty ()) 
                { 
                    do_write (); 
                } 
            } 
            다른 
            { 
                close_socket (); 
            } 
        }); 
    } 

개인:
     부울 is_connected_; 
    :: ASIO :: io_service 향상io_service_; 
    TCP :: 소켓 socket_; 
    chat_message의 read_msg_; 
    chat_message_queue write_msgs_; 
}; 

INT 본체 ( 의 INT 는 argc,  * 는 argv []) 
{ 

    경우 (는 argc! = 3 ) 
    { 
        표준 : cerr << " 용도 : chat_client <호스트> <포트> \ n을 " ;
        반환  1 ; 
    } 
    동안을 ( 사실  )
    { 
        시도 
        {
            부스트 : ASIO :: io_service의 io_service을; 

            TCP :: 리졸버 리졸버 (io_service); 
            자동 endpoint_iterator = resolver.resolve ({는 argv [ 1 ]는 argv [ 2 ]}); 
            chat_client의 C (io_service, endpoint_iterator); 

            표준 : 스레드 t ([io_service () {io_service.run ();}); 

            //          문자 라인 [chat_message :: max_body_length + 1];
            //          (표준 : cin.getline (라인 chat_message :: max_body_length + 1)) 동안
             //          {
             //              chat_message의 MSG;
            //             msg.body_length (표준 : 나 strlen (라인));
            //              표준 : 방어 적이기 (msg.body (), 선, msg.body_length ());
            //              msg.encode_header ();
            //              c.write (MSG);
            //          } 
            동안 (c.get_connected ()) 
            { 
                표준 : this_thread :: sleep_for (표준 : 크로노 :: 밀리 초 ( 1 )); 
            } 

            c.close (); 
            t.join (); 
        } 
        캐치 (표준 : 예외 & E) 
        { 
            표준 : cerr << " 예외 : "<< e.what () << " \ 않음을 " ; 
        } 
    } 


    반환  0 ; 
}

 

추천

출처www.cnblogs.com/luhouxiang/p/11084266.html