Ho visto molte risorse qui su SO su Sockets. Credo che nessuno di loro riguardasse i dettagli che volevo sapere. Nella mia applicazione, il server esegue tutta l'elaborazione e invia aggiornamenti periodici ai client.Introduzione alla programmazione dei socket in C# - Best practice
Intenzione di questo post è di coprire tutte le idee di base richieste durante lo sviluppo di un'applicazione socket e discutere le migliori pratiche. Ecco le cose di base che vedrai con quasi tutte le applicazioni basate su socket.
1 - rilegatura e l'ascolto su un socket
Sto usando il seguente codice. Funziona bene sulla mia macchina. Devo occuparmi di qualcos'altro quando lo distribuisco su un server reale?
IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(localHost.AddressList[0], 4444);
serverSocket = new Socket(endPoint.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
serverSocket.Bind(endPoint);
serverSocket.Listen(10);
2 - Ricezione dati
ho utilizzato un array di dimensioni 255 byte. Quindi, quando sto ricevendo dati che sono più di 255 byte, ho bisogno di chiamare il metodo di ricezione fino a quando non ottengo i dati completi, giusto? Una volta ottenuti i dati completi, devo aggiungere tutti i byte ricevuti finora per ottenere il messaggio completo. È corretto? O c'è un approccio migliore?
3 - invio di dati e specificando la lunghezza dei dati
Poiché non v'è alcun modo in TCP per trovare la lunghezza del messaggio per ricevere, sto progettando di aggiungere la lunghezza al messaggio. Questo sarà il primo byte del pacchetto. Quindi i sistemi client sanno quanti dati sono disponibili per la lettura.
Qualsiasi altro approccio migliore?
4 - Chiusura del cliente
Quando cliente è chiuso, invierà un messaggio al server che indica la chiusura. Il server rimuoverà i dettagli del client dal suo elenco di client. Di seguito è riportato il codice utilizzato sul lato client per disconnettere il socket (parte di messaggistica non mostrata).
client.Shutdown(SocketShutdown.Both);
client.Close();
Eventuali suggerimenti o problemi?
5 - Chiusura server
Server invia un messaggio a tutti i clienti che indicano l'arresto. Ogni client disconnetterà il socket quando riceve questo messaggio. I client invieranno il messaggio di chiusura al server e chiuderanno. Una volta che il server riceve il messaggio di chiusura da tutti i client, disconnette il socket e interrompe l'ascolto. Chiama Disponi su ogni socket client per rilasciare le risorse. È l'approccio corretto?
6 - sconosciuto disconnessioni client
A volte, un client può staccare senza informare il server. Il mio piano per gestire questo è: quando il server invia messaggi a tutti i client, controlla lo stato del socket. Se non è connesso, rimuovi il client dall'elenco dei client e chiudi il socket per quel client.
Qualsiasi aiuto sarebbe fantastico!
Ho avuto problemi con IPAddress ascolto su qualche versione precedente di Windows. Uso di IPAddress ipAddress = new IPAddress (new byte [] {0, 0, 0, 0}); sembra essere il migliore per me! – clamchoda