I don't think there's a problem with the TCP/connection portion of things. My feeling is that the problem is lurking somewhere in the timing of the application, or in the way LabVIEW task scheduling/multitasking is working compared to the way you expect it to work.
For instance, I'm wondering why you stuck with 25 seconds (25000 ms) as the timeout value for the Telnet Read in Telnet Handler.vi. I assume you're expecting LabVIEW to quickly "sleep" that while loop and move on to check on the while loops of any other Telnet Handler.vi instances that might have been spawned as a result of connection requests from other remote clients.
Instead, it seems to me (on my system, anyway, with three simultaneous connections active) that LabVIEW is not cyc
ling through the other Telnet Handler.vi instances as you expect, but is only getting to them to read a byte at a time each time the main loop iterates in response to a byte appearing from the first of the three remote clients.
If you change the Telnet Read timeout to 50 ms instead, the behavior is closer to what you might expect, but still not perfect.
Because timing/threading/scheduling is a complicated subject in LabVIEW, I'm going to give LabVIEW the benefit of the doubt and assume it's operating as designed. Maybe someone else can provide more insight into what's happening in this particular case, and whether reentrancy or something else is affecting things.
One option I would consider if I were in your shoes: program a simpler version of things that mimics Date Server.vi and cycles through a queue of connections to service them without relying on spawning new reentrant instances of a handler VI.
I realize that your version of things (along with the reentrancy example
that ships with LabVIEW) is expressly intended to handle this daemon-style situation, but simpler may be better for the purposes of debugging and development ease.
My two cents,
John Lum
National Instruments