2017-12-13 16 views
1

제 문제는 다음과 같습니다. 비동기 TCP 서버와 해당 비동기 클라이언트가 있습니다. 내가 필요한 것은 내 클라이언트 (연속적으로)에 실시간 변수를 쓸 수있는 동시에 클라이언트로부터 명령을받을 수있는 방법입니다.async_read를 수행하는 동안 루프에서 boost :: asio :: io_service async_write를 수행하십시오.

클라이언트가이 작업을 트리거해야하는 명령을 보내면 테스트 메시지 만 보내지 만 그 후에는 서버가 클라이언트를 기다리는 동안 응답하지 않기 때문에 하나의 메시지 만 보낼 수있는 방법을 찾습니다. 명령.

이 기능은 클라이언트에서 보낸 명령을 처리하는 하나이며받은 후 함수 h_read에 전달 : 나는 명령의 쓰기 지속적으로 트리거해야 하나입니다 있는지 확인 여기에

void conn::h_write() { 
    memset(data_, '\0', sizeof(char)*max_length); 
    async_read_until(sock_ , input_buffer_, '\n', 
    boost::bind(&conn::h_read, shared_from_this())); 

} 

실시간 버퍼를 클라이언트에 전달합니다.이 경우 명령은 "c"입니다.

void conn::h_read(){ 
    std::string line; 
    std::istream is(&input_buffer_); 
    std::getline(is, line); 
    std::string output = ""; 
    output.reserve(5000); 
    if (line == "exit"){ 
     return; 
    } 
    if (line.empty()){ 
     memset(data_, '\0', sizeof(char)*max_length); 
     async_read_until(sock_ , input_buffer_, '\n', boost::bind(&conn::h_read, shared_from_this())); 
     return; 
    } 

    clientMessage_ = line;  
    clientMessage_ += '\n'; 

    if (clientMessage_.substr(0,1) == "c"){ 
     std::stringstream toSend; 
     streamON = true; 
     toSend.str("c l 1 "); 
     toSend << std::fixed << std::setprecision(2) << luxID1[0]; 
     toSend.str(" "); 
     // Here I sent the real time value for the first time 
     boost::asio::async_write(sock_, boost::asio::buffer(toSend.str()), boost::bind(&conn::sendRealTime, shared_from_this())); 
    }  
    else{ // Does't really matter to this example 
     // Do some stuff here and send to client 
     boost::asio::async_write(sock_, boost::asio::buffer(I2CrxBuf_), boost::bind(&conn::h_write, shared_from_this())); 
    } 
} 

지금이 변수의 연속 전송을 처리해야하는 기능입니다 그러나 동시에 명령 클라이언트를 읽을 수 :

void conn::sendRealTime(){ 
    if (streamON){ 
     boost::asio::async_write(sock_, boost::asio::buffer("This is a test\n"), boost::bind(&conn::h_write, shared_from_this())); 
     memset(data_, '\0', sizeof(char)*max_length); 
     async_read_until(sock_ , input_buffer_, '\n', boost::bind(&conn::h_read, shared_from_this())); 
    } 
    else{ 
     memset(data_, '\0', sizeof(char)*max_length); 
     async_read_until(sock_ , input_buffer_, '\n', boost::bind(&conn::h_read, shared_from_this())); 
    } 
} 

문제는 그 첫 번째 후 차단 "async_read_util"함수를 호출하십시오.

내가 원한 것이 가능할 지조차 모르지만 누군가가 나를 어떻게 도와 주실 수 있습니까? 내가 필요로 무엇

답변

1

동시에 클라이언트에서 명령을 수신 할 수있는 반면, (계속) 내 클라이언트 실시간 변수에 쓸 수있는 방법입니다.

이것은 문제가되지 않습니다.

읽기 및 쓰기 기능을 분리하십시오. 소켓이 성공적으로 연결/초기화 된 후 async_read_until 번으로 전화하십시오. 그런 다음 read-handler에서 다시 호출하십시오. 아무데도. 이것은 읽기 조작을 수행하는 일반적인 f}입니다.

또한 프로그램 스트림이 다른 그러한 async_read, async_read_until 스트림의 async_read_some 함수 또는 이 수행하는 다른 합성 작업과 같은 작업 (읽을 수행되도록해야 documentation.

참조하십시오 이 작업이 완료 될 때까지 읽습니다.

읽기 버퍼의 데이터에는 예상보다 많은 데이터가 포함되어있을 수 있습니다.

성공적인 async_read_until 작업 후, streambuf의는 은 구분 기호 이외의 추가 데이터를 포함 할 수있다. 응용 프로그램은 보통 이 후속 async_read_until 작업을 검사하기 위해 해당 데이터를 streambuf에 남깁니다.