How to know data size in UDP?
Brandon S. Allbery KF8NH
allbery at ece.cmu.edu
Thu Oct 29 07:45:05 EDT 2009
On Oct 29, 2009, at 04:31 , Kazu Yamamoto (山本和彦) wrote:
> Since the handle is associated with UDP, the entire data size should
> be known when a UDP packet arrived. But I cannot find a way to know
> data size. (I want a function like hFileSize.) Note that hGetContents
> blocks.
The short answer is: you can't. You need to find a way to make
recv() work.
Longer: read() is intended for streams. If you read() a datagram
socket you may get a single packet or the system may combine packets;
which one happens depends on the kernel implementation, and you are
not guaranteed to have anything sane happen. The best case for you
would be if the system returns a single packet per system call, in
which case you read() into a maximally sized buffer and the returned
length is that of the actual packet. However, many systems choose to
retain the stream nature of read() and will return any information
that comes in, losing the packet boundaries.
In the case of DNS, you can almost get away with this anyway because
the protocol specifies a maximum UDP request/response length of 255
octets sent as a single packet. If this is insufficient, you need to
switch to TCP. In the case of a response, you will get a truncated
response and will need to recognize it by parsing the data and retry
the query over TCP.
--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery at kf8nh.com
system administrator [openafs,heimdal,too many hats] allbery at ece.cmu.edu
electrical and computer engineering, carnegie mellon university KF8NH
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 195 bytes
Desc: This is a digitally signed message part
Url : http://www.haskell.org/pipermail/glasgow-haskell-users/attachments/20091029/a31a1b02/PGP-0001.bin
More information about the Glasgow-haskell-users
mailing list