2013-03-12 1 views
4

먼저 하나의 큰 문자열로 조합하지 않고 TCP를 통해 여러 문자열을 보내고 싶습니다. ASIO의 분산 수집 I/O 인터페이스가이를 이해할 수 있습니다. 그러나, 구현이 메모리 오류로 계속 실행되기 때문에 나는 뭔가 잘못하고 있어야합니다. 내가 write(sock, buffer("this is a really long string"))을 수행 할 때ASIO 분산 수집 I/O가 신비한 메모리 오류를 야기 함

#include <vector> 
#include <string> 
#include <boost/asio.hpp> 

using namespace std; 
using namespace boost::asio; 
using namespace boost::asio::ip; 

int main() { 
    io_service service; 
    tcp::acceptor acceptor(service, tcp::endpoint(tcp::v4(), 11211)); 
    tcp::socket sock(service); 
    acceptor.accept(sock); 
    if (!acceptor.is_open()) return 1; 
    string s = "this is a really long string"; 
    vector<const_buffer> vec; 
    vec.push_back(buffer(s)); 
    write(sock, buffer(vec)); 
} 

그러나, 그것은 잘 작동 : I telnet localhost 11211 때 (컴파일 가능한 및 실행 가능한) 아래의 코드 조각은 왜곡 된 문자열을 반환합니다. 내가 여기서 무엇을 놓치고 있니?

+1

[scatter-gather I/O]에 대한 'buffer'참조 확인 (http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/buffer.html#boost_asio.reference) .buffer.buffers_and_scatter_gather_i_o) 사용하는 예제에는 데이터 벡터가 아닌 ASIO 버퍼 벡터가 있습니다. 아마도 당신은 그것을 시도 할 수 있습니까? –

+0

@ JoachimPileborg : 이전에 시도했습니다. 예제가 해당 메소드를 사용하도록 업데이트되었으며 여전히 같은 방식으로 실패합니다. – int3

답변

6

의 마지막 행은 다음과 같습니다 buffer 무료 기능은 항상, 즉 단일 버퍼, mutable_buffers_1 반환하기 때문에

write(sock, vec); 

은 그렇지 않으면, "분산이-수집"아니다. 귀하의 경우에는 다음과 같은 buffer 과부하가 호출됩니다 : 당신의 벡터가 잘못 처리됩니다,는 "POD의 벡터"아니다

template <typename PodType, typename Allocator> 
inline mutable_buffers_1 buffer(std::vector<PodType, Allocator>& data) 
{ 
    return mutable_buffers_1(mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(PodType))); 
} 

입니다.

+0

나는'buffer'가 멱등수라고 가정했지만 복사 생성자가 아니므로 그 동작을 기대해서는 안됩니다. 정말 고맙습니다! – int3

+3

@ int3 IMHO, 그런 코드는 전혀 컴파일해서는 안됩니다. 관련 패치를 ASIO에 제출하겠습니다. –

2

이 경우 쓰기 위해 버퍼를 전달할 필요가 없습니다. 당신이

write(sock, vec); 

으로 문제를 귀하의 예제의 마지막 문자열을 다시 작성하는 경우 대부분 해결 될 것입니다.

관련 문제