Cómo trabajar con sockets en C #

La comunicación entre procesos es la capacidad de intercambiar datos entre dos o más procesos conectados y se puede lograr mediante sockets. Después de que se establece una conexión entre el servidor y el cliente, es decir, el proceso del servidor y el proceso del cliente, pueden comunicarse con el propósito de intercambiar datos mediante sockets.

Un socket es el punto final de una comunicación bidireccional entre dos procesos que se ejecutan en una red. Puede aprovechar los espacios de nombres System.Net y System.Net.Sockets para trabajar con sockets en C #. Mientras que el primero se utiliza para operaciones de alto nivel que utilizan sockets, el segundo se utiliza para cualquier operación de bajo nivel cuando se trabaja con sockets.

Cuando trabaje con sockets, puede utilizar los mecanismos de comunicación TCP / IP (Protocolo de control de transmisión / Protocolo de Internet) o UDP / IP (Protocolo de datagramas de usuario / Protocolo de Internet). Para intercambiar datos entre dos o más procesos a través de una red, puede aprovechar los protocolos de transporte TCP y UDP. Mientras que el TCP (Protocolo de control de transmisión) es un protocolo orientado a la conexión seguro y confiable, el UDP (Protocolo de datagramas de usuario) es un protocolo relativamente menos seguro o confiable, rápido y sin conexión.

La siguiente lista de códigos ilustra cómo puede aprovechar la clase System.Net.Dns para mostrar la dirección IP de su 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();

        }

Consulte la lista de códigos anterior. Mientras que el método Dns.GetHostName () devuelve el nombre del sistema, el método Dns.Resolve () se usa para recuperar una matriz de tipo IPHostEntry.

Recuperando información de la red

El espacio de nombres System.Net.NetworkInformation se puede utilizar para recuperar metadatos de red (es decir, cambios de red, eventos de red, propiedades, etc.) en C #. Como ejemplo, si desea verificar si hay una conexión de red disponible, puede usar el método GetIsNetworkAvailable () como se muestra a continuación.

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

Así es como puede llamar a este método en su código.

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable();

Si desea monitorear los cambios en la dirección IP, puede usar los siguientes eventos de la clase NetworkChange.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

Para recuperar la información sobre las interfaces de red, puede utilizar el método GetAllNetworkInterfaces () de la clase NetworkInterface.

NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

Una vez que haya recuperado la lista de todas las interfaces de red, puede utilizar el siguiente código para mostrar la información de cada una de las interfaces de red en la consola.

foreach (NetworkInterface networkInterface in networkInterfaces)

            {

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

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

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

            }

Aquí está la lista completa de códigos para su referencia.

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();

        }

Programación cliente-servidor

Cuando trabaje con programación de red usando TCP, normalmente necesitaría crear un proceso de servidor que debería comenzar en un puerto en particular y también un proceso de cliente que puede comenzar en cualquier puerto y enviar una solicitud de conexión al servidor. El proceso del servidor, una vez iniciado, escucha las solicitudes de conexión entrantes en el puerto en el que se inició. El siguiente fragmento de código ilustra cómo puede aprovechar la clase System.Net.Sockets.TcpListener y usarla junto con la clase socket.

TcpListener listener = new TcpListener(1234);

listener.Start();

Socket socket = listener.AcceptSocket();

Stream networkStream = new NetworkStream(socket);

El siguiente fragmento de código ilustra cómo su cliente de socket puede conectarse al servidor mediante el protocolo 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);

Para enviar datos al servidor desde el cliente, puede utilizar el siguiente fragmento de código.

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

}

El método Receive () de la clase de socket se puede utilizar para recibir datos. He aquí cómo puede usarlo para recuperar datos de un socket. Tenga en cuenta que tanto el método Enviar como el Recibir están bloqueando, es decir, bloquearían el hilo que se está ejecutando actualmente hasta que se envíen o reciban datos.

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

Tenga en cuenta que debe incorporar los espacios de nombres System.Net y System.Net.Sockets en su programa para trabajar con sockets.

using System.Net;

using System.Net.Sockets;