From: Roshan on
To Any Whom Can Answer,

Hello. I am using Microsoft's Visual C++ 6.0 UDP application
(msocudp)
to retrieve packets from a device that is connected to our network.
The problem is the UDP application will not receive all the packets
from the device.


I even used Ethereal (packet sniffer) program to ensure the packets
arrive at my computer and they definitely do!


So I'm stumped as to why the OnReceive() callback function in the UDP
socket code doesn't get invoked for all the packets that arrive. For
example, for 10 packets that may be sent by the device, the UDP
application would only receive 9 packets (i.e. OnReceive() only gets
called 9 times instead of 10).


Please provide any help, if you know the answer.


Regards,


Roshan


Exeltech Software Developer
From: Igor Tandetnik on
"Roshan" <roshan(a)exeltech.com> wrote in message
news:05455473-b89e-42ec-b1f8-bc11cb0cdc99(a)24g2000hsh.googlegroups.com
> So I'm stumped as to why the OnReceive() callback function in the UDP
> socket code doesn't get invoked for all the packets that arrive. For
> example, for 10 packets that may be sent by the device, the UDP
> application would only receive 9 packets (i.e. OnReceive() only gets
> called 9 times instead of 10).

Datagrams arrive faster than you read them. If a datagram arrives while
you haven't yet retrieved a previous one, it's dropped on the floor.

Realize that UDP protocol is inherently unreliable. Datagrams can get
lost, duplicated (the same datagram arriving more than once), and/or
received out of order. It is up to the application to correct for this.
--
With best wishes,
Igor Tandetnik

With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925


From: Scott McPhillips [MVP] on
"Roshan" <roshan(a)exeltech.com> wrote in message
news:05455473-b89e-42ec-b1f8-bc11cb0cdc99(a)24g2000hsh.googlegroups.com...
> To Any Whom Can Answer,
>
> Hello. I am using Microsoft's Visual C++ 6.0 UDP application
> (msocudp)
> to retrieve packets from a device that is connected to our network.
> The problem is the UDP application will not receive all the packets
> from the device.
>
>
> I even used Ethereal (packet sniffer) program to ensure the packets
> arrive at my computer and they definitely do!
>
>
> So I'm stumped as to why the OnReceive() callback function in the UDP
> socket code doesn't get invoked for all the packets that arrive. For
> example, for 10 packets that may be sent by the device, the UDP
> application would only receive 9 packets (i.e. OnReceive() only gets
> called 9 times instead of 10).
>
>
> Please provide any help, if you know the answer.


The answer is that UDP is designed for speed, not reliability. It is
expected to lose some packets. (Yes, even if you see the packets with a
sniffer.) It is very difficult for an application program to keep up with
closely-spaced UDP packets. You can improve upon this somewhat by receiving
the packets in a high-priority thread that does very little else.

If you cannot afford to lose a few percent of the packets then you should
not use UDP.

--
Scott McPhillips [VC++ MVP]

From: Roshan on
On May 15, 7:57 pm, "Scott McPhillips [MVP]" <org-dot-mvps-at-
scottmcp> wrote:
> "Roshan" <ros...(a)exeltech.com> wrote in message
>
> news:05455473-b89e-42ec-b1f8-bc11cb0cdc99(a)24g2000hsh.googlegroups.com...
>
>
>
>
>
> > To Any Whom Can Answer,
>
> > Hello. I am using Microsoft's Visual C++ 6.0 UDP application
> > (msocudp)
> > to retrieve packets from a device that is connected to our network.
> > The problem is the UDP application will not receive all the packets
> > from the device.
>
> > I even used Ethereal (packet sniffer) program to ensure the packets
> > arrive at my computer and they definitely do!
>
> > So I'm stumped as to why the OnReceive() callback function in the UDP
> > socket code doesn't get invoked for all the packets that arrive. For
> > example, for 10 packets that may be sent by the device, the UDP
> > application would only receive 9 packets (i.e. OnReceive() only gets
> > called 9 times instead of 10).
>
> > Please provide any help, if you know the answer.
>
> The answer is that UDP is designed for speed, not reliability.  It is
> expected to lose some packets.  (Yes, even if you see the packets with a
> sniffer.)  It is very difficult for an application program to keep up with
> closely-spaced UDP packets.  You can improve upon this somewhat by receiving
> the packets in a high-priority thread that does very little else.
>
> If you cannot afford to lose a few percent of the packets then you should
> not use UDP.
>
> --
> Scott McPhillips [VC++ MVP]- Hide quoted text -
>
> - Show quoted text -


Scott,

Thank you so much for the response and info. I really appreciate it.

The packet sniffer is an application itself, correct? Therefore, if it
can fetch and read all the packets, then
should it not be true that a VC++ application () do the same?

- Roshan
Exeltech Software Developer
From: Roshan on
On May 15, 7:57 pm, "Scott McPhillips [MVP]" <org-dot-mvps-at-
scottmcp> wrote:
> "Roshan" <ros...(a)exeltech.com> wrote in message
>
> news:05455473-b89e-42ec-b1f8-bc11cb0cdc99(a)24g2000hsh.googlegroups.com...
>
>
>
>
>
> > To Any Whom Can Answer,
>
> > Hello. I am using Microsoft's Visual C++ 6.0 UDP application
> > (msocudp)
> > to retrieve packets from a device that is connected to our network.
> > The problem is the UDP application will not receive all the packets
> > from the device.
>
> > I even used Ethereal (packet sniffer) program to ensure the packets
> > arrive at my computer and they definitely do!
>
> > So I'm stumped as to why the OnReceive() callback function in the UDP
> > socket code doesn't get invoked for all the packets that arrive. For
> > example, for 10 packets that may be sent by the device, the UDP
> > application would only receive 9 packets (i.e. OnReceive() only gets
> > called 9 times instead of 10).
>
> > Please provide any help, if you know the answer.
>
> The answer is that UDP is designed for speed, not reliability.  It is
> expected to lose some packets.  (Yes, even if you see the packets with a
> sniffer.)  It is very difficult for an application program to keep up with
> closely-spaced UDP packets.  You can improve upon this somewhat by receiving
> the packets in a high-priority thread that does very little else.
>
> If you cannot afford to lose a few percent of the packets then you should
> not use UDP.
>
> --
> Scott McPhillips [VC++ MVP]- Hide quoted text -
>
> - Show quoted text -


I will definitely try using threads and will let you know.

Regards,

Roshan