Ο κώδικας έχει διάφορα θεματάκια. Καταρχήν, μπορείς να χρησιμοποιήσεις την κλάση UdpClient η οποία διευκολύνει τη λήψη και την αποστολή UDP datagrams. Ρίξε μία ματιά στο Using UDP Services για να δεις πόσο ευκολότερη είναι η χρήση της. Δεύτερον, η GetStringFromSocket είναι κάπως περιττή. Μπορείς να μετατρέψεις ένα byte array απευθείας σε string με την GetString. Υποψιάζομαι επίσης ότι τα syslog datagrams δεν είναι κωδικοποιημένα σε UTF8 αλλά ASCII, οπότε αντί για UTF8 θα πρέπει να χρησιμοποιήσεις το Encoding.ASCII.GetString.
Τέλος και ίσως το σημαντικότερο, χρησιμοποιείς busy waiting που σημαίνει ότι το service σου δεν σταματάει ποτέ να ακούει, ούτε καν για να ... το σταματήσεις από το control panel. Το κυρίως thread ενός service είναι αυτό το οποίο δέχεται τις εντολές start/stop από τα windows. Ρίξε μία ματιά στο documentation του UdpClient.BeginReceive για να δεις πως να ακούς ασύγχρονα για datagrams χωρίς να μπλοκάρεις το κυρίως thread του service σου.
Άλλο ένα σημαντικό θέμα είναι ότι τα services δεν έχουν κάποιο UI οπότε δεν υπάρχει εύκολος τρόπος να σε ειδοποιήσουν ότι κάτι πάει στραβά. Θα πρέπει να βάλεις τον κατάλληλο κώδικα για logging και καταχωρήσεις σε Performance Counters για να ξέρεις τί συμβαίνει με το service, αν έσκασε κάτι, πόσα datagrams παίρνει το λεπτό κλπ.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos