Domanda

Qualcuno potrebbe indicarmi la giusta direzione per imparare a fare networking in C # /. net 3.5? Esempi di codice e spiegazioni sono ben accetti. Fondamentalmente sto cercando come fare modelli di server / client asincroni / multithread.

Sono abbastanza a mio agio con le basi su come realizzare questo in C ++ con WinSock, ma sebbene tutte le mie ricerche non riescano a cogliere questo concetto in C #.

Grazie per l'assistenza che puoi fornire :)

È stato utile?

Soluzione

Se WCF soddisfa le tue esigenze, vale la pena dare un'occhiata. ZeroC e altre librerie alternative di livello superiore. Altrimenti ci sono diversi modi per avvicinarsi al livello del socket se è quello che ti serve.

TcpClient / classe UdpClient

Questi forniscono un involucro relativamente sottile attorno alle prese sottostanti. Fornisce essenzialmente uno Stream sul socket. È possibile utilizzare i metodi asincroni su NetworkStream (BeginRead, ecc.). Non mi piace questo in quanto il wrapper non fornisce così tanto e tende ad essere un po 'più imbarazzante rispetto all'utilizzo diretto del socket.

Socket: selezionare

Ciò fornisce la classica tecnica Select per il multiplexing di più socket IO su un singolo thread. Non più raccomandato.

Socket - Stile APM

Il modello di programmazione asincrona (AKA IAsyncResult, Begin / End Style) per socket è la tecnica principale per utilizzare i socket in modo asincrono. E ci sono diverse varianti. In sostanza, chiami un metodo asincrono (ad esempio BeginReceive) ed esegui una delle seguenti operazioni:

  1. Sondaggio per completamento sull'IAsyncResult restituito (appena utilizzato).
  2. Utilizzare WaitHandle da IAsyncResult per attendere il completamento del metodo.
  3. Passa al metodo BeginXXX un metodo di callback che verrà eseguito al termine del metodo.

Il modo migliore è il n. 3 in quanto è di solito il più conveniente. In caso di dubbi, utilizzare questo metodo.

Alcuni link:

Socket .NET 3.5 ad alte prestazioni

.NET 3.5 ha introdotto un nuovo modello per socket asincroni che utilizza eventi. Utilizza la "quotazione semplificata" modello asincrono (ad es. Socket.SendAsync). Invece di dare un callback, ti ??iscrivi a un evento per il completamento e invece di un IAsyncResult, ottieni SocketAsyncEventArgs. L'idea è che è possibile riutilizzare SocketAsyncEventArgs e pre-allocare memoria per socket IO. In scenari ad alte prestazioni questo può essere molto più efficiente rispetto all'utilizzo dello stile APM. Inoltre, se si pre-alloca la memoria, si ottiene un footprint di memoria stabile, riduzione della garbage collection, buchi di memoria da bloccare ecc. Si noti che preoccuparsi di questo dovrebbe essere preso in considerazione solo negli scenari più performanti.

Sommario

Nella maggior parte dei casi utilizzare il metodo di callback dello stile APM a meno che non si preferisca lo stile del metodo SocketAsyncEventArgs / Async. Se hai utilizzato CompletionPorts in WinSock, dovresti sapere che entrambi questi metodi usano CompletionPorts sotto il cofano.

Altri suggerimenti

Nel mondo di .NET 3.5 dovresti sicuramente imparare Windows Communication Foundation - .NET framework per il networking.

Link utile:

Operazioni sincrone e asincrone (in WCF)

Puoi trovare utili informazioni WCF sui post di navigazione StackOverflow taggati con WCF tag

Dipende da ciò su cui vuoi concentrarti.

Se vuoi concentrarti sulla funzionalità e lasciare l'impianto idraulico al framework, inizia con Windows Communication Foundation.

Se stai cercando di costruire il tuo impianto idraulico, usa la classe System.Net.Sockets.Socket .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top