Как да работя с гнезда в C #

Комуникацията между процесите е способността за обмен на данни между два или повече свързани процеса и може да бъде постигната с помощта на сокети. След като се установи връзка между сървъра и клиента, т.е. сървърният процес и клиентският процес, те могат да комуникират с цел обмен на данни чрез сокети.

Сокетът е крайната точка на двупосочната комуникация между два процеса, работещи в мрежа. Можете да използвате пространствата от имена System.Net и System.Net.Sockets за работа с сокети в C #. Докато първият се използва за операции на високо ниво, използващи гнезда, вторият се използва за всякакви операции на ниско ниво, когато се работи с гнезда.

Когато работите с сокети, можете да използвате или комуникационни механизми TCP / IP (Transmission Control Protocol / Internet protocol) или UDP / IP (User Datagram Protocol / Internet protocol). За да обменяте данни между два или повече процеса през мрежа, можете да се възползвате от транспортните протоколи TCP и UDP. Докато TCP (Transmission Control Protocol) е сигурен и надежден протокол, ориентиран към свързване, UDP (User Datagram Protocol) е относително по-малко сигурен или надежден, бърз и без връзка протокол.

Следният списък с кодове илюстрира как можете да се възползвате от класа System.Net.Dns за показване на IP адреса на вашата система.

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

        }

Вижте списъка с кодове по-горе. Докато методът Dns.GetHostName () връща името на системата, методът Dns.Resolve () се използва за извличане на масив от тип IPHostEntry.

Извличане на мрежова информация

Пространството от имена System.Net.NetworkInformation може да се използва за извличане на метаданни на мрежата (т.е. мрежови промени, мрежови събития, свойства и т.н.) в C #. Като пример, ако искате да проверите дали е налична мрежова връзка, можете да използвате метода GetIsNetworkAvailable (), както е показано по-долу.

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

Ето как можете да извикате този метод във вашия код.

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable();

Ако искате да наблюдавате промените в IP адреса, можете да използвате следните събития от класа NetworkChange.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

За да извлечете информацията за мрежовите интерфейси, можете да използвате метода GetAllNetworkInterfaces () от класа NetworkInterface.

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

            }

Ето пълния списък с кодове за справка.

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

        }

Програмиране клиент-сървър

Когато работите с мрежово програмиране, използвайки TCP, обикновено ще трябва да създадете процес на сървър, който трябва да стартира на определен порт, а също и клиентски процес, който може да стартира на всеки порт и да изпрати заявка за свързване към сървъра. Процесът на сървъра, след като е стартиран, изслушва входящите заявки за връзка на порта, на който е стартиран. Следният кодов фрагмент илюстрира как можете да се възползвате от класа System.Net.Sockets.TcpListener и да го използвате заедно с класа сокет.

TcpListener listener = new TcpListener(1234);

listener.Start();

Socket socket = listener.AcceptSocket();

Stream networkStream = new NetworkStream(socket);

Следният кодов фрагмент илюстрира как вашият сокет клиент може да се свърже със сървъра чрез 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);

За да изпратите данни на сървъра от клиента, можете да използвате следния кодов фрагмент.

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

}

Методът Receive () от клас сокет може да се използва за получаване на данни. Ето как можете да го използвате за извличане на данни от сокет. Имайте предвид, че и методите за изпращане и получаване блокират, т.е. те ще блокират изпълняваната в момента нишка, докато данните не бъдат изпратени или получени.

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

Обърнете внимание, че трябва да включите пространствата от имена System.Net и System.Net.Sockets във вашата програма, за да работите с сокети.

using System.Net;

using System.Net.Sockets;