Wenn du aus Netzwerksockets liest und nicht aus Dateien, dann musst du unter *nix definitiv in den nichtblockierenden Modus schalten, sofern dein Programm nicht ewig auf Daten warten soll. Unter Windows sind Sockets soweit ich weiß standardmäßig nichtblockierend.
Ich kann Dir so aus der hohlen Hand heraus natürlich nicht sagen, warum dein Programm unter Solaris nicht wie gewünscht funktioniert.
Ein wichtiger Hinweis für nichtblockierende Ein- oder Ausgabe ist noch, dass man den Fehlerstatus von sysread überprüfen sollte: Gibt sysread undef zurück und steht $! auf EWOULDBLOCK, so heißt das, dass keine Daten gelesen wurden, weil die Leseoperation blockiert hätte. Gibt sysread 0 zurück, so heißt das, dass keine Daten gelesen wurden, weil definitiv keine mehr da sind (Datei zu Ende oder Socketverbindung geschlossen).
When C++ is your hammer, every problem looks like your thumb.