Jak pracować z gniazdami w C #

Komunikacja międzyprocesowa to możliwość wymiany danych między dwoma lub więcej połączonymi procesami i można ją osiągnąć za pomocą gniazd. Po nawiązaniu połączenia między serwerem a klientem, czyli ustanowieniu procesu serwera i klienta, mogą oni komunikować się w celu wymiany danych za pomocą gniazd.

Gniazdo to punkt końcowy dwukierunkowej komunikacji między dwoma procesami działającymi w sieci. Przestrzenie nazw System.Net i System.Net.Sockets można wykorzystać do pracy z gniazdami w języku C #. Podczas gdy pierwsza jest używana do operacji wysokiego poziomu przy użyciu gniazd, druga jest używana do wszelkich operacji niskiego poziomu podczas pracy z gniazdami.

Podczas pracy z gniazdami można korzystać z mechanizmów komunikacji TCP / IP (protokół kontroli transmisji / protokół internetowy) lub UDP / IP (protokół datagramów użytkownika / protokół internetowy). Aby wymieniać dane między dwoma lub więcej procesami w sieci, można skorzystać z protokołów transportowych TCP i UDP. Podczas gdy TCP (Transmission Control Protocol) jest bezpiecznym i niezawodnym protokołem zorientowanym na połączenie, UDP (User Datagram Protocol) jest stosunkowo mniej bezpiecznym lub niezawodnym, szybkim i bezpołączeniowym protokołem.

Poniższa lista kodu ilustruje, jak można wykorzystać klasę System.Net.Dns do wyświetlenia adresu IP systemu.

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

        }

Zapoznaj się z powyższą listą kodów. Podczas gdy metoda Dns.GetHostName () zwraca nazwę systemu, metoda Dns.Resolve () służy do pobierania tablicy typu IPHostEntry.

Pobieranie informacji o sieci

Przestrzeń nazw System.Net.NetworkInformation może służyć do pobierania metadanych sieci (tj. Zmian w sieci, zdarzeń sieciowych, właściwości itp.) W języku C #. Na przykład, jeśli chcesz sprawdzić, czy połączenie sieciowe jest dostępne, możesz użyć metody GetIsNetworkAvailable (), jak pokazano poniżej.

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

Oto, jak możesz wywołać tę metodę w swoim kodzie.

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable();

Jeśli chcesz monitorować zmiany w adresie IP, możesz wykorzystać następujące zdarzenia z klasy NetworkChange.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

Aby pobrać informacje o interfejsach sieciowych, możesz użyć metody GetAllNetworkInterfaces () klasy NetworkInterface.

NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

Po pobraniu listy wszystkich interfejsów sieciowych możesz użyć następującego fragmentu kodu, aby wyświetlić informacje o każdym interfejsie sieciowym w konsoli.

foreach (NetworkInterface networkInterface in networkInterfaces)

            {

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

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

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

            }

Oto pełna lista kodów w celach informacyjnych.

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

        }

Programowanie klient-serwer

Podczas pracy z programowaniem sieciowym przy użyciu protokołu TCP zwykle trzeba utworzyć proces serwera, który powinien rozpoczynać się na określonym porcie, a także proces klienta, który można uruchomić na dowolnym porcie i wysłać żądanie połączenia do serwera. Proces serwera po uruchomieniu nasłuchuje żądań połączeń przychodzących na porcie, na którym został uruchomiony. Poniższy fragment kodu ilustruje, jak można wykorzystać klasę System.Net.Sockets.TcpListener i używać jej w połączeniu z klasą gniazda.

TcpListener listener = new TcpListener(1234);

listener.Start();

Socket socket = listener.AcceptSocket();

Stream networkStream = new NetworkStream(socket);

Poniższy fragment kodu ilustruje, w jaki sposób klient gniazda może łączyć się z serwerem przy użyciu protokołu 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);

Aby wysłać dane do serwera z klienta, możesz użyć następującego fragmentu kodu.

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

}

Do odbierania danych można użyć metody Receive () klasy gniazda. Oto, jak możesz go użyć do pobrania danych z gniazda. Zwróć uwagę, że obie metody wysyłania i odbierania są blokujące, tj. Blokowałyby aktualnie wykonywany wątek do momentu wysłania lub odebrania danych.

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

Zauważ, że powinieneś włączyć do programu przestrzenie nazw System.Net i System.Net.Sockets, aby móc pracować z gniazdami.

using System.Net;

using System.Net.Sockets;