So arbeiten Sie mit Sockets in C #

Die prozessübergreifende Kommunikation ist die Fähigkeit, Daten zwischen zwei oder mehr verbundenen Prozessen auszutauschen und kann über Sockets erreicht werden. Nachdem eine Verbindung zwischen Server und Client hergestellt wurde, dh der Serverprozess und der Clientprozess hergestellt wurden, können sie zum Zweck des Datenaustauschs über Sockets kommunizieren.

Ein Socket ist der Endpunkt einer bidirektionalen Kommunikation zwischen zwei Prozessen, die über ein Netzwerk ausgeführt werden. Sie können die Namespaces System.Net und System.Net.Sockets nutzen, um mit Sockets in C # zu arbeiten. Während Ersteres für Operationen auf hoher Ebene mit Sockets verwendet wird, wird Letzteres für Operationen auf niedriger Ebene verwendet, wenn mit Sockets gearbeitet wird.

Wenn Sie mit Sockets arbeiten, können Sie entweder die Kommunikationsmechanismen TCP / IP (Transmission Control Protocol / Internet Protocol) oder UDP / IP (User Datagram Protocol / Internet Protocol) verwenden. Um Daten zwischen zwei oder mehr Prozessen über ein Netzwerk auszutauschen, können Sie die TCP- und UDP-Transportprotokolle nutzen. Während das TCP (Transmission Control Protocol) ein sicheres und zuverlässiges verbindungsorientiertes Protokoll ist, ist das UDP (User Datagram Protocol) ein relativ weniger sicheres oder zuverlässiges, schnelles und verbindungsloses Protokoll.

Die folgende Codeliste zeigt, wie Sie die System.Net.Dns-Klasse nutzen können, um die IP-Adresse Ihres Systems anzuzeigen.

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

        }

Siehe die obige Codeliste. Während die Methode Dns.GetHostName () den Namen des Systems zurückgibt, wird mit der Methode Dns.Resolve () ein Array vom Typ IPHostEntry abgerufen.

Netzwerkinformationen abrufen

Der System.Net.NetworkInformation-Namespace kann zum Abrufen von Netzwerkmetadaten (dh Netzwerkänderungen, Netzwerkereignissen, Eigenschaften usw.) in C # verwendet werden. Wenn Sie beispielsweise überprüfen möchten, ob eine Netzwerkverbindung verfügbar ist, können Sie die unten gezeigte Methode GetIsNetworkAvailable () verwenden.

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

So können Sie diese Methode in Ihrem Code aufrufen.

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable();

Wenn Sie die Änderungen an der IP-Adresse überwachen möchten, können Sie die folgenden Ereignisse der NetworkChange-Klasse verwenden.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

Um die Informationen zu den Netzwerkschnittstellen abzurufen, können Sie die GetAllNetworkInterfaces () -Methode der NetworkInterface-Klasse verwenden.

NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

Nachdem Sie die Liste aller Netzwerkschnittstellen abgerufen haben, können Sie den folgenden Code verwenden, um die Informationen der einzelnen Netzwerkschnittstellen in der Konsole anzuzeigen.

foreach (NetworkInterface networkInterface in networkInterfaces)

            {

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

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

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

            }

Hier ist die vollständige Codeliste als Referenz.

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

        }

Client-Server-Programmierung

Wenn Sie mit der Netzwerkprogrammierung über TCP arbeiten, müssen Sie normalerweise einen Serverprozess erstellen, der an einem bestimmten Port gestartet werden soll, sowie einen Clientprozess, der an einem beliebigen Port starten und eine Verbindungsanforderung an den Server senden kann. Der Serverprozess wartet nach dem Start auf eingehende Verbindungsanforderungen an dem Port, an dem er gestartet wurde. Das folgende Codefragment zeigt, wie Sie die System.Net.Sockets.TcpListener-Klasse nutzen und in Verbindung mit der Socket-Klasse verwenden können.

TcpListener listener = new TcpListener(1234);

listener.Start();

Socket socket = listener.AcceptSocket();

Stream networkStream = new NetworkStream(socket);

Das folgende Codefragment zeigt, wie Ihr Socket-Client mithilfe des TCP-Protokolls eine Verbindung zum Server herstellen kann.

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

Um Daten vom Client an den Server zu senden, können Sie das folgende Codefragment verwenden.

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

}

Die Receive () -Methode der Socket-Klasse kann zum Empfangen von Daten verwendet werden. Hier erfahren Sie, wie Sie damit Daten von einem Socket abrufen können. Beachten Sie, dass sowohl die Sende- als auch die Empfangsmethode blockieren, dh den aktuell ausgeführten Thread blockieren, bis Daten gesendet oder empfangen wurden.

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

Beachten Sie, dass Sie die Namespaces System.Net und System.Net.Sockets in Ihr Programm integrieren sollten, um mit Sockets arbeiten zu können.

using System.Net;

using System.Net.Sockets;