recvfrom a large packet
From: Bernd Petrovitsch <hidden>
Date: 2012-11-06 22:20:26
On Die, 2012-11-06 at 16:08 +0200, Victor Buciuc wrote:
On Tue, Nov 6, 2012 at 1:35 PM, devendra.aaru [off-list ref] wrote:quoted
if i do a recvfrom (sk, buf, 10000, 0, &addr, &len), shall i recv all the data i mean the 10000 bytes?
Not necessarily. Consider the case that the other side sends only 9000 bytes.
quoted
since fragmentation happen in the ip layer and assembled happen in the ip layer it doesnt matter for the upper layer about the packet size.
[....]
quoted
i wrote a test code and it seems to be working.
You tried one case and then you think it is in all cases the same? You are very optimistic .....
quoted
is there any problem will come if i turn on firewall.
[...] Try it. "Turn on firewall" is also not very precise ....
I think a signal can interrupt recvfrom. If you already had some data copied in the buffer then it will return something. You should
No, if a signal interrupts the recvfrom(), recvfrom() returns -1 (and errno == EINTR). Thus it cannot report any partially received packet and so there is nothing written to the buffer.
always check what you get in the result returned by recvfrom. If you're not satisfied with what you got you can always call again. (I assumed it's UDP we're talking about).
That is actually the only robust way:
1) append the read data to a buffer
2) check if enough is there to handle a packet. If not goto 1)
3) handle the first packet and delete it.
4) goto 2)
Kind regards,
Bernd
--
Bernd Petrovitsch Email : bernd at petrovitsch.priv.at
LUGA : http://www.luga.at