2016-10-10 2 views
1

간단한 서버 클라이언트 응용 프로그램이 있습니다.C++ asio socket 서버에서 응답 받기

idia는 다음과 같습니다. 클라이언트가 sql-request를 사용하여 서버 문자열로 전송합니다. 서버가 요청을 처리하고 CSV 스타일 문자열로 형식화 된 데이터로 클라이언트 응답으로 되돌려 보내십시오.

모든 것이 이미 조정되었습니다. 한 가지만 허용합니다. 문제는 내가받은 문자열의 크기를 모르므로 클라이언트에서 응답을 읽는 것입니다.

코드를 넣고있다 :

서버 :

std::string answer; 
answer = sql_read(*msg); //get the string with data from request 
clientSock->write_some(buffer(answer, answer.size())); //send it back on client 

클라이언트 :

std::string answer; 
bytesRead = sock->read_some(boost::asio::buffer(readBuf, inputSize)); //read the answer, but how do I know correct size of string? 
string_ptr msg(new std::string(readBuf, bytesRead)); 
answer = *msg; 

어떻게 크기를 모른 채 결과 문자열을 읽을 수? 또는 내 aproach (문자열로 데이터를 보내는)가 근본적으로 잘못된 방법으로 올바른 방법으로 수행하는 경우?

+0

팁 : 'clientSock-> write_some()'은 모든 데이터를 쓰지 않을 수도 있습니다. 반환 값을 확인하고 루프에서 호출해야합니다. Asio는 이러한 불편 함을 피하기위한 도우미 기능을 가지고 있습니다. 예 :'boost :: asio :: write (sock, boost :: asio :: buffer (answer));'. –

답변

1

클라이언트와 서버가 서로 대화하는 데 사용하는 프로토콜에서 직접 처리해야합니다.

한 가지 방법은 구분 기호를 사용하고 boost::asio::read_until()을 사용하는 것입니다. 예 :

boost::asio::streambuf buf; 
boost::asio::read_until (sock, buf, "\r\n"); // or '\0' if zero terminated 

Check the Boost.Asio documentation.

또 다른 방법은 가변 길이 부분을 보내기 전에 고정 길이 헤더로 크기를 보내는 것입니다.

0

문자열의 크기를 미리 알 수 없습니다. read_some을 수행 할 때 소켓에서 모든 데이터를 읽으려면 루프를 수행해야합니다. 읽은 바이트 수와 할당 한 버퍼의 크기를 확인해야합니다. 이들이 같으면 읽기 버퍼를 채우고 남아있는 데이터를 확인하기 위해 다른 읽기를 수행해야합니다.

관련 문제