Сетевое программирование в C# (часть 1)
20 Май 2009 – 20:28Среда .NET предоставляет два пространства имен: System.Net и System.Net.Sockets для работы с сетью. Эти пространства имен содержат классы и методы, которые позволяют легко создавать программы, которые могут взаимодействовать через сеть. Взаимодействие может осуществляться как с постоянным подключением по сети, так и без него. Также можно работать как с потокоориентированными данными так и с датаграммами. Наиболее распростанены протоколы TCP (использует потокоориентированное подключение) и UDP (приложения, ориентированные на датаграммы).
Класс System.Net.Sockets.Socket - это основной класс из пространства имен System.Net.Sockets. Экземпляр класса Socket имеет локальную и удаленную точку подключения, через которые он работает. Локальная точка подключения содержит информацию о подключении текущего состояния сокета.
Также существует несколько вспомогательных классов, таких как IPEndPoint, IPAdress, SocketException и др., которые используют при создании сетевых программ. Среда .NET поддерживает синхронное и асинхронное подключения между клиентом и сервером. Для этих двух типов взаимодействия по сети используются различные методы.
Синхронное подключение работает в блочном режиме, в котором метод ожидает завершения операции перед возвратом значения. А вот асинхронное подключение работает в неблочном режиме, при котором значение возвращается сразу, даже если операция взаимодействия не окончена.
Dns класс
Пространство имен System.Net предоставляет класс Dns, с помощью которого можно создавать и посылать запросы для получения информации о хосте сервера через Службу Доменных Имен Интернета (Internet Domain Name Service). Ну и соответственно, чтобы получить доступ к DNS, необходимо чтобы машина, выполняющая запрос, была подключена к сети. А вот если запрос выполнить на компьютере не имеющем доступа к серверу доменных имен, то возникнет исключительная ситуация System.Net.SocketException. Все члены этого класса являются статическими. Наиболее интересные будут описаны ниже.
public static IPHostEntry GetHostByAddress(string address)
Адрес необходимо задавать в формате «ХХХ.ХХХ.ХХХ.ХХХ». Этот метод возвращает объект класса IPHostEntry, который содержит информацию о запрошеном хосте. Если сервер DNS не доступен, метод вернет исключение SocketException.
public static string GetHostName()
Этот метод возвращает DNS имя хоста локальной машины.
public static IPHostEntry Resolve(string hostname)
Метот преобразовывает DNS имя хоста или IP адрес в объект класса IPHostEntry. Имя хоста должно быть предоставлено форматах вида 127.0.0.1 или www.microsoft.com.
IPHostEntry класс
Этот класс является контейнером для информации о адресах хостов Интернета. Он не содержит гарантий потокобезопасности. Ниже описаны наиболее интересные члены этого класса.
Свойство AddressList
Предоставляет массив IPAddress, содержащий IP адреса, которые соответствуют имени хоста.
Свойство Aliases
Предоставляет массив строк, который содержит DNS имена, соответствующие IP адресам в свойстве AddressList.
Программа ниже показывает использование обоих классов:
using System;
using System.Net;
using System.Net.Sockets;
class MyClient
{
public static void Main()
{
IPHostEntry IPHost = Dns.Resolve("www.hotmail.com");
Console.WriteLine(IPHost.HostName);
string []aliases = IPHost.Aliases;
Console.WriteLine(aliases.Length);
IPAddress[] addr = IPHost.AddressList;
Console.WriteLine(addr.Length);
for(int i= 0; i < addr.Length ; i++)
{
Console.WriteLine(addr[i]);
}
}
}
IPEndPoint класс
Этот класс реализует абстрактных класс EndPoint. IPEndPoint класс представляет собой сетевую точку как IP адрес и номер порта. Ниже показана небольшая конструкция, использующая этот класс:
IPEndPoint(long addresses, int port)
IPEndPoint (IPAddress addr, int port)
IPHostEntry IPHost = Dns.Resolve("managedcode.info");
Console.WriteLine(IPHost.HostName);
string []aliases = IPHost.Aliases;
IPAddress[] addr = IPHost.AddressList;
Console.WriteLine(addr[0]);
EndPoint ep = new IPEndPoint(addr[0],80);
Во второй части будет описана работа с сокетами.


Вы должны войти, чтобы оставить комментарий.