Boost logo

Boost Users :

Subject: Re: [Boost-users] [asio] Reading datagram packets
From: Chard (boost_at_[hidden])
Date: 2009-01-24 12:59:54


>"Igor R" <boost.lists_at_[hidden]> wrote in message
> >news:cfe0a3cf0901221545q4927fa9n8078396308cb850d_at_mail.gmail.com...
>> char m_buf[10];
>> udp::endpoint m_endpoint;
>><-->
>> udpSocket.async_receive_from(buffer(buf), m_endpoint, bind(ReadHandler,
>> ...));
>> service.run();

>>If more than 10 characters were in the datagram packet, how can they be
>>accessed?
>>Calling other read methods (after processing in the ReadHandler) just
>>appears to block (I guess it is looking for another >>packet).
>
>In the ReadHandler you can synchronously read the remained data , like this
>(untested!):
>size_t avail = udpSocket.available();
>std::vector<char> data(avail);
>udpSocket.read(buffer(data));

I had originally tried this, which is why I mentioned that calling other
read methods blocked. The "available" method returns 0, which is consistent
with the block. (Also, there is no "read" method, only _receive_ methods.)

I am using asio on the Windows platform, so I examined the code and
ultimately it routes to the WSARecv SDK function. The MSDN documentation
provided with MSVC7.1 (VS 2003) says that any datagram data that overflows
the buffer is thrown away. The latest MSDN documentation suggests that the
MSG_PARTIAL feature must be supported in order to acquire the data that
overflows; I did a quick scan of asio to see if this was ever used, but
didn't notice it.

It seems that providing a buffer large enough for the data I expect to deal
with is the most reliable approach.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net