Come lavorare con i socket in C #

La comunicazione tra processi è la capacità di scambiare dati tra due o più processi connessi e può essere ottenuta utilizzando i socket. Dopo aver stabilito una connessione tra il server e il client, cioè il processo del server e il processo del client, possono comunicare allo scopo di scambiare dati utilizzando i socket.

Un socket è il punto finale di una comunicazione bidirezionale tra due processi in esecuzione su una rete. È possibile sfruttare gli spazi dei nomi System.Net e System.Net.Sockets per lavorare con i socket in C #. Mentre il primo viene utilizzato per operazioni di alto livello utilizzando i socket, il secondo viene utilizzato per qualsiasi operazione di basso livello quando si lavora con i socket.

Quando si lavora con i socket, è possibile utilizzare i meccanismi di comunicazione TCP / IP (Transmission Control Protocol / Internet) o UDP / IP (User Datagram Protocol / Internet protocol). Per scambiare dati tra due o più processi su una rete, è possibile sfruttare i protocolli di trasporto TCP e UDP. Mentre il TCP (Transmission Control Protocol) è un protocollo orientato alla connessione sicuro e affidabile, l'UDP (User Datagram Protocol) è un protocollo relativamente meno sicuro o affidabile, veloce e senza connessione.

L'elenco di codice seguente illustra come sfruttare la classe System.Net.Dns per visualizzare l'indirizzo IP del sistema.

public static void Main(string[] args)

        {

            string hostName = Dns.GetHostName();

            try

            {

                IPAddress[] ipAddress = Dns.Resolve(hostName).AddressList;

                foreach (IPAddress address in ipAddress)

                    Console.WriteLine("{0}/{1}", hostName, address);

            }

            catch (Exception ex)

            {

                Console.WriteLine("Error occurred: "+ex.Message);

            }

            Console.Read();

        }

Fare riferimento all'elenco dei codici sopra. Mentre il metodo Dns.GetHostName () restituisce il nome del sistema, il metodo Dns.Resolve () viene utilizzato per recuperare un array di tipo IPHostEntry.

Recupero delle informazioni di rete

Lo spazio dei nomi System.Net.NetworkInformation può essere utilizzato per recuperare i metadati di rete (ad esempio, modifiche di rete, eventi di rete, proprietà e così via) in C #. Ad esempio, se desideri verificare se una connessione di rete è disponibile, puoi utilizzare il metodo GetIsNetworkAvailable () come mostrato di seguito.

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable ();

Ecco come puoi chiamare questo metodo nel tuo codice.

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable();

Se desideri monitorare le modifiche nell'indirizzo IP puoi utilizzare i seguenti eventi della classe NetworkChange.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

Per recuperare le informazioni sulle interfacce di rete è possibile utilizzare il metodo GetAllNetworkInterfaces () della classe NetworkInterface.

NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

Dopo aver recuperato l'elenco di tutte le interfacce di rete, è possibile utilizzare la seguente parte di codice per visualizzare le informazioni di ciascuna interfaccia di rete nella console.

foreach (NetworkInterface networkInterface in networkInterfaces)

            {

                Console.WriteLine("Network ID :  " + networkInterface.Id);

                Console.WriteLine("Network Name :  " + networkInterface.Name);

                Console.WriteLine("Network Description\n:  " + networkInterface.Description);               

            }

Ecco l'elenco completo del codice come riferimento.

static void Main(string[] args)

        {

            NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface networkInterface in networkInterfaces)

            {

                Console.WriteLine("Network ID  :  " + networkInterface.Id);

                Console.WriteLine("Network Name  :  " + networkInterface.Name);

                Console.WriteLine("Network Description  \n:  " + networkInterface.Description);               

            }

            Console.Read();

        }

Programmazione client-server

Quando si lavora con la programmazione di rete utilizzando TCP, è generalmente necessario creare un processo server che dovrebbe iniziare da una porta particolare e anche un processo client che può iniziare su qualsiasi porta e inviare una richiesta di connessione al server. Il processo del server dopo che è stato avviato, ascolta le richieste di connessione in entrata sulla porta su cui è stato avviato. Il frammento di codice seguente illustra come sfruttare la classe System.Net.Sockets.TcpListener e usarla insieme alla classe socket.

TcpListener listener = new TcpListener(1234);

listener.Start();

Socket socket = listener.AcceptSocket();

Stream networkStream = new NetworkStream(socket);

Il frammento di codice seguente illustra come il client socket può connettersi al server utilizzando il protocollo TCP.

String ipAddress = "specify the ip address here";

System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse(ipAddress);

System.Net.IPEndPoint remoteEndPoint = new IPEndPoint (ipAddress,9000);

socketClient.Connect (remoteEndPoint);

Per inviare dati al server dal client, è possibile utilizzare il seguente frammento di codice.

try

{

  String text = "Hello World!";

  byte[] data = System.Text.Encoding.ASCII.GetBytes(text);

  socketClient.Send(data);

}

catch (SocketException se)

{

  //Write your exception handling code here

}

Il metodo Receive () della classe socket può essere utilizzato per ricevere i dati. Ecco come puoi usarlo per recuperare i dati da un socket. Notare che entrambi i metodi Send e Receive sono bloccanti, cioè bloccherebbero il thread attualmente in esecuzione fino a quando i dati non saranno stati inviati o ricevuti.

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

Nota che dovresti incorporare gli spazi dei nomi System.Net e System.Net.Sockets nel tuo programma per lavorare con i socket.

using System.Net;

using System.Net.Sockets;