Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS Windows / Знакомство с Hyper-V.pdf
Скачиваний:
31
Добавлен:
22.07.2019
Размер:
4.26 Mб
Скачать

Создание сокета Hyper-V

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

Вот простое определение сокета

Пример:

// Windows

SOCKET WSAAPI socket( _In_ int af,

_In_ int type, _In_ int protocol

);

// Linux guest

int socket(int domain, int type, int protocol);

Для сокета Hyper-V:

Семейство адресов— AF_HYPERV (Windows) или AF_VSOCK (гостевая ОС Linux)

Тип— SOCK_STREAM

Протокол— HV_PROTOCOL_RAW (Windows) или 0 (гостевая ОС Linux)

Пример объявления или создания экземпляра:

// Windows

SOCKET sock = socket(AF_HYPERV, SOCK_STREAM, HV_PROTOCOL_RAW);

// Linux guest

int sock = socket(AF_VSOCK, SOCK_STREAM, 0);

Привязка к сокету Hyper-V

Привязка связывает сокет со сведениями о подключении.

Определение этой функции скопировано ниже для удобства. Подробнее о привязке см. здесь.

Пример :

// Windows

 

int bind(

 

_In_ SOCKET

s,

_In_ const struct sockaddr *name,

_In_ int

namelen

);

 

// Linux guest

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

unsigned short
__kernel_sa_family_t

В отличие от адреса сокета (sockaddr) для стандартного семейства адресов протокола IP (AF_INET), который состоит из IP-адреса хост-компьютера и номера порта на этом узле, адрес сокета для AF_HYPERV использует для подключения идентификатор виртуальной машины и описанный выше идентификатор приложения. При привязке через гостевую ОС Linux AF_VSOCK использует svm_cid

и svm_port.

Так как сокеты Hyper-V не зависят от сетевого стека, TCP/IP, DNS ит.д., для конечной точки сокета требуется формат, не использующий протокол IP и имя узла, но однозначно описывающий подключение.

Вот определение адреса сокета Hyper-V:

Пример :

// Windows

struct SOCKADDR_HV

{

ADDRESS_FAMILY Family; USHORT Reserved;

GUID VmId;

GUID ServiceId;

};

//Linux guest

//See include/uapi/linux/vm_sockets.h for more information. struct sockaddr_vm {

svm_family; svm_reserved1;

unsigned int svm_port; unsigned int svm_cid;

unsigned char svm_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - sizeof(unsigned short) -

sizeof(unsigned int) - sizeof(unsigned int)];

};

Вместо протокола IP или имени узла конечные точки AF_HYPERV используют два кода GUID:

ИД ВМ— это уникальный идентификатор виртуальной машины. Его можно узнать с помощью следующего фрагмента кода PowerShell.

PowerShell (Get-VM -Name $VMName).Id

Идентификатор службы— код GUID, описанный выше, под которым приложение зарегистрировано в реестре узла Hyper-V.

Кроме того, для идентификатора виртуальной машины доступен ряд подстановочных знаков.

Подстановочные знаки для идентификатора виртуальной машины

Название

Код GUID

Описание

 

00000000-0000-

Прослушиватели необходимо привязать к этому

HV_GUID_ZERO

0000-0000-0000

идентификатору виртуальной машины, чтобы

 

00000000

принимать подключения от всех разделов.

HV_GUID_WILDC

00000000-0000-

Прослушиватели необходимо привязать к этому

0000-0000-0000

идентификатору виртуальной машины, чтобы

ARD

00000000

принимать подключения от всех разделов.

 

HV_GUID_BROAD

FFFFFFFF-FFFF-

 

FFFF-FFFF-

 

CAST

 

FFFFFFFFFFFF

 

 

 

 

 

Адрес из подстановочных знаков для дочерних

HV_GUID_CHILDR

90db8b89-0d35-

элементов. Прослушиватели необходимо привязать

EN

4f79-8ce9-49ea0

к этому идентификатору виртуальной машины,

ac8b7cd

чтобы принимать подключения от дочерних

 

 

 

элементов.

HV_GUID_LOOPB

e0e16197-

Петлевой адрес. При использовании этого адреса

dd56-4a10-9195

ACK

-5ee7a155a838

выполняется подключение к разделу соединителя.

 

 

 

a42e7cda-

Адрес родительского элемента. При использовании

HV_GUID_PARENT

d03f-480c-9cc2-

этого адреса выполняется подключение к

 

a4de20abb878

родительскому разделу соединителя*.

* HV_GUID_PARENT Родительский элемент виртуальной машины— это ее узел.

Родительский элемент контейнера— это узел контейнера. При подключении из контейнера, запущенного в виртуальной машине, будет выполнено подключение к виртуальной машине, в которой размещен контейнер. Прослушивание для этого VmId поддерживает подключение от (в контейнерах): узла контейнера. (В виртуальной машине: узел контейнера или без контейнера): узла виртуальной машины. (Не в виртуальной машине: узел контейнера или без контейнера): не поддерживается.