Hi Simon,
the most common cause of this sort of thing is "lost events".
When a packet arrives in the NetTalk DLL an event is sent to the appropriate thread as a sort of "data is waiting" alert.
(the event number is stored in net._connection.NotifyEvent - it's different for every object).
[aside: it's safe to generate extra events - which is your first thing to try, perhaps on a timer or something]
The event goes to the topmost window on the _thread_. So, if "another window" is open on the thread, above the one that is listening, then events get "lost" (more accurately they go to the other window which just goes meh and throws them away.)
"OtherWindow" might be a MESSAGE, or SendEmail, or Webclient, or any other window that has an ACCEPT loop.
First prize is obviously "don't let another window be on top".
Second prize is to generate extra NotifyEvents to fetch any backlog of packets that may be waiting...
cheers
Bruce