1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void UdpClient::Send(const ip::udp::endpoint& endpoint, const void* source, size_t bytes) { std::vector<char> sendBuffer; sendBuffer.resize(bytes); std::memcpy(sendBuffer.data(), source, bytes); socket.async_send_to( buffer(sendBuffer.data(), sendBuffer.size()), // send data endpoint, [this, buf = std::move(sendBuffer)](const boost::system::error_code& error, size_t bytes){ // completion handler if (!error) this->OnSend(); else this->OnDisconnect(); }); } | cs |
asio로 간단한 테스트 udp 클라이언트를 만들던 중 다음과 같은 코드를 사용했었는데 송신한 크기가 0으로 오더라
뭔가 문제가 있을 여지가 있다곤 직감적으로 생각하곤 있었지만 어떻게 될까 하는 마음에 그대로 코드를 작성했는데 역시나였다 -.-
호출 순서가 [this, buf = std::move(sendBuffer)] -> sendBuffer.data(), sendBuffer.size() 순으로 되는 듯 하다.
buf로 sendBuffer가 move되고, sendBuffer는 메모리가 전부 이전이 되었으므로 크기가 0이다.
따라서 sendBuffer.size()가 호출이 되었을 때 0이 되었던 거다.
굳이 저런걸 하고 싶다면
auto senddata = sendBuffer.data();
auto sendsize = sendBuffer.size();
socket.async_send_to(buffer(senddata, sendsize), ...); 같은 코드를 작성하면 멀쩡하게 돌아간다.