Техническая документация Heredes

01. API. Инициализация библиотеки

функция параметры
InitIONLibrary Синтаксис:
void InitIONLibrary (void);
Параметры у данной функции отсутствуют. Основная цель данной функции - инициализация использования heredes.dll в вашем приложении.
Данную функцию Ваше приложение должно вызвать однократно перед использованием Heredes API.

02. API. Получить дескриптор нового подключения

функция параметры
CreateIONHandle Синтаксис:
HANDLE CreateIONHandle (void);
Параметры у данной функции отсутствуют. Создает окружение для нового исходящего (клиент) подключения. Возвращает дескриптор подключения.
Пример:
HANDLE hDcon = CreateIONHandle();

03. API. закрыть дескриптор подключения

функция параметры
void CloseIONHandle Синтаксис:
CloseIONHandle(HANDLE hConn); в качестве параметра принимает дескриптор подключения полученый функцией CreateIONHandle. Функция закрывает дескрипторы созданные функцией CreateIONHandle и освобождает регион памяти занятый окружением подключения.
Пример:
CloseIONHandle(hDcon);

04. API. Регистрация нового пользователя

функция параметры
void RegIONId Синтаксис:
void RegIONId(LPDWORD LocValid, LPDWORD LocId);
LocValid - указатель на переменную которая получит код подтверждения владельца идентификатора. Значение переменной не учитывается при значении LocId равном нулю LocId - указатель на переменную которая получит личный идентификатор. Переменная должна быть равна нулю если требуется зарегистрировать новый идентификатор. Данная функция работает синхронно. не следует без нужды вызывать данную функцию каждый раз при запуске программы, вместо этого следует сохранить идентификатор пользователя и код подтверждения для дальнейшего использования. Функция не возвращает значений но в случае успеха переменные LocValid и LocId содержат значения отличные от нуля.

Об идентификаторах пользователей

Установление соединение между пользователями осуществляется посредством личных уникальных идентификаторов.

Идентификатор пользователя это число от 0х1 до 0хFFFFFFF0 (32 бита).

Когда пользователь запрашивает у STUN сервера параметры исходящего подключения либо уведомляет STUN сервер о готовности принять входящее соединение он передает личный идентификатор и ключ подтверждающий регистрацию.

Ключ подтверждения идентификатора это так же число от 0х1 до 0хFFFFFFF0 (32 бита).

STUN сервер сверяет соответствие личного идентификатора с ключем подтверждения.

Таким образом осуществляется два уровня безопасности: проверка STUN сервером пользователя на валидность (не считается безопасной) и использование пользователями секретных ключей шифрования которые могут не передаваться по сети в зависимости от реализации вашим программным обеспечением. Кроме того Вы можете при передаче личных данных осуществлять свою систему шифрования, алгоритм которой может быть известен только Вам.

Для регистрации нового пользователя и получения личного идентификатора и кода подтверждения следует использовать функцию RegIONId.

О состояниях подключения

Для определения текущего состояния соединения вы можете использовать Callback функцию, которая получает уведомления о состоянии - статус состояния

статус описание
0 соединение с STUN сервером не установлено
1 соединение с STUN сервером активно
2 получены данные для прямого подключения
3 попытка установить прямое подключение и проверка секретного ключа
4 ошибка секретного ключа шифрования
5 секретный ключ согласован
6 соединение успешно установлено, возможен прямой обмен данными

05. API. Получить состояние подключения

функция параметры
int IONGetStatus Синтаксис:
int IONGetStatus(HANDLE hConn); hConn - дескриптор подключения полученный функцией CreateIONHandle или IONWaitConnection Возвращает номер состояния подключения. Подробнее о состояниях подключения.

06. API. Установить исходящее соединение

функция параметры
BOOL IONConnectToId Синтаксис:
void IONConnectToId(HANDLE hConn,
LPDWORD pId,
LPDWORD LocValid,
LPDWORD LocId,
LPVOID SecStr,
CBSELID CBSelUser,
CBSTATUS CBStatus,
CBUDATA CBUserData);
p>hConn - дескриптор подключения полученный функцией CreateIONHandle

pId - зарезервировано для будущего использования.

LocValid - указатель на содержащую код подтверждения владельца идентификатора. Переменная должна быть равна нулю.

LocId - указатель на переменную содержащую личный идентификатор. Переменная должна быть равна нулю.

pSecStr - адресс 8-ми байтного массива, содержащего ключ шифрования

CBSelUser - указатель на функцию-обработчик события интерфейса. Может быть NULL если не требуется обращения к локальному списку идентификаторов.

CBStatus - указатель на функцию-обработчик хода подключения (уведомлений о текущем статусе).

CBUserData - указатель на функцию-обработчик при входящих пользовательских данных, отправленных функцией IONSendUserData. Может быть NULL если входящие пользовательские данные не ожидаются.

Функция возвращает TRUE в случае успеха или FALSE если подключение не удалось.

07. API. Обработчик пользовательских данных

функция параметры
CBUserData Синтаксис:

CBUDATA CBUserData(HANDLE hConn,
LPDWORD pData,
int datSize);

hConn - дескриптор подключения полученный функцией CreateIONHandle

pData - указатель на массив входящих данных

datSize - длинна пользовательских данных в байтах

функция возвращает TRUE в случае успеха или FALSE если подключение не удалось

08. API. Сбросить исходящее соединение

функция параметры
void IONDisconnect Синтаксис: void IONDisconnect(HANDLE hConn);

hConn - дескриптор подключения полученный функцией CreateIONHandle или WaitIONConnection

Разрывает текущее активное соединение или прекращает попытки установить соединение.

09. API. Ожидание входящего соединения

функция параметры
IONWaitConnection Синтаксис: HANDLE IONWaitConnection(LPDWORD LocValid,
LPDWORD LocId, CBUDATA CBUserData);

LocValid - указатель на переменную которая получит код подтверждения владельца идентификатора. Значение переменной не учитывается при значении LocId равном нулю

LocId - указатель на переменную которая получит личный идентификатор. Переменная должна быть равна нулю если требуется зарегистрировать новый идентификатор

CBUDATA - указатель на процедуру-обработчик CBUserData входящих пользовательских данных отправленных c помощью SendUserData

функция запускает поток ожидания входящих соединений и возвращает идентификатор подключения. Для освобождения памяти и завершения потока ожидания используйте IONTerminate

10. API. Остановить ожидание входящих соединений

функция параметры
void IONTerminate Синтаксис: void IONTerminate(HANDLE hConn);

hConn - дескриптор подключения полученный функцией IONWaitConnection

Разрывает текущее активное соединение и завершает поток ожидающий входящих соединений. Не следует использовать данную функцию с параметром полученным CreateIONHandle

.

Отличие от IONDisconnect в том что в случае вызова IONTerminate, завершается и ожидающий поток, таким образом повторное подключение к потоку станет невозможным

.

11. API. Передача пользовательских данных неопределенного типа

функция параметры
SendUserData Синтаксис: int SendUserData(HANDLE hConn,
PVOID UserDataAddr
DWORD LongData);

hConn - дескриптор подключения полученный функцией CreateIONHandle или IONWaitConnection

hUserDataAddr - указатель строку с произвольными пользовательскими данными

LongData - длинна пользовательских данных

Функция возвращает количество байт поставленных в очередь на отправку и не гарантирует их доставку. Ваше приложение должно организовать при необходимости подтверждение получения данных.

Следует учитывать, что серверное приложение будет отправлять пользовательские данные блоками от 30 до 1006 байт и Ваше приложение должно самостоятельно разбить отправляемые данные на части и маркировать в каком порядке. Их следует собрать. Так же Ваше приложение должно обеспечить целостность полученных данных, запросив повторную отправку утерянного блока если требуется гарантированная доставка.

Ваше приложение может использовать дополнительные произвольные алгоритмы шифрования перед вызовом SendUserData для усиления безопасности.

Следует принять во внимание, что SendUserData может использоваться только для передачи данных при активном коннекте (статус 6). Также, отправка производится блоками 992 байта. В случае отправки блока большего размера, будут отправлены только первые 992 байта. Функция возвращает количество фактически переданных байт.

12. API. Передача файлов

функция параметры
IONSendFileToId Синтаксис: int IONSendFileToId(LPDWORD pValid, LPDWORD pId, CBSELID CBSelUser, LPDWORD pHightDword);

pValid - указатель на переменную типа DWORD содержащую код подтверждения владельца идентификатора

pId - указатель на переменную типа DWORD содержащую идентификатор

CBSelUse - указатель на CALLBACK процедуру для обработки WM_COMMAND. Вы можете использовать данную функцию для предоставления пользователю выбора идентификатора, создания интерфейсов и тд. Может быть NULL если Id получателя пользователь вводит только вручную

pHightDword - указатель на старшие 4 байта размера переданых байт

фнкция возвращает младшие 4 байта размера переданных байт

если старший бит в значении по адресу pHightDword установлен в 1 (значение более 0х80000000) значит произошла ошибка при передаче данных и файл передан не полностью. Ваше приложение должно самостоятельно решать как обрабатывать подобные ошибки

Таким образом теоретическое верхнее ограничение на размер передаваемого файла соответствено 8 388 608 ТБт, тем не менее стоит учитывать что передача ведется поверх UDP и подвержена помехам, таким образом не исключены непредсказуемые сбои в процессе передачи, не все из которых способна обработать данная функция

13. API. Инициализация аудио

функция параметры
IONSetAudioParam Синтаксис: void IONSetAudioParam(HANDLE hConn, bool FPlay, LPCTSTR pFileOut, LPCTSTR pFileIn, CBAIN CBInAud);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

FPlay - флаг воспроизведения. Установите TRUE если вы не хотите воспроизводить входящий аудио поток. Одновременное указание FALSE в параметрах FPlay и NULL в pFileSpeak приведет к отказу принимать входящий аудиопоток.

pFileMic - полный путь и имя файла для паралельной записи исходящего аудио. Для корректного воспроизведения записанного файла другими приложениями, например Windows Media Player или другими, следует указывать расширение файла *.wav. Данный параметр должен быть NULL если режим паралельной записи в файл не требуется.

pFileSpeak - полный путь и имя файла для паралельной записи входящего аудио. Для корректного воспроизведения записанного файла другими приложениями, например Windows Media Player или другими, следует указывать расширение файла *.wav. Данный параметр должен быть NULL если режим паралельной записи в файл не требуется.

CBInAud - адресс callback функции для реакции на входящий аудиопоток. может быть NULL

Данная функция создает окружение и устанавливает параметры обработки для входящего и исходящего аудиопотока. Вы можете вызвать ее однажды и использовать стандартные установки для аудиосоединенй с любым Id или устанавливать индивидуально для каждого входящего или исходящего соединения

Вы не обязаны вызывать данную функцию если Ваше приложение использует SendUserData для отправки аудиопотока, но это необходимо перед использованием аудио-функций Heredes API

14. API. Начать передачу аудио потока

функция параметры
IONStartAudioStream Синтаксис: bool IONStartAudioStream(Handle hConn, int nSamplesPerSec);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

nSamplesPerSec - Частота дискретизации (Герц). Допустимые значения 8000, 11025, 22050, 44100. В случае если даное значение NULL - по умолчанию принимается частота 11025 Гц

Вызов данной функции следует производить после установления соединения (статус соединения 6). Функция возвращает значение сразу после создания аудиоканала или в случае ошибки

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

В случае успеха, вызывающая сторона открывает доступ к микрофону в моно режиме (используется один аудиоканал). В случае невозможности получить доступ к устройствам воспроизведения аудио на принимающей стороне, доступ к микрофону так же не открывается и функция возвращает нулевое значение

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

Аудиопоток передается в формате PCM моно с указанной в параметре nSamplesPerSec частотой и при соответствующих параметрах сохраняется в формате wave

Ваше приложение должно вызвать IONSetAudioParam для установки параметров перед использованием данной функции

Ваше приложение должно обязательно вызвать IONStopAudioStream для корректного завершения передачи аудиопотока

15. API. Прервать передачу аудио потока

функция параметры
IONStopAudioStream Синтаксис: void IONStopAudioStream(Handle hConn);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

Функция уведомляет удаленныый ID о завершении передачи аудиопотока, что вызывает освобождение соответствующих аудиоустройств и закрытие всех открытых дескрипторов для обработки

Вызывать данную функцию обязана только передающая сторона. При этом вызов данной функции не влияет на входящий аудиопоток и его обработку

16. API. Установка параметров видеопотока

функция параметры
SetINVISTParam Синтаксис: void SetINVISTParam (Handle hConn,
HDC hDC,
int widthX,
int heightY,
int rightX,
int rightY, CBSTATUS INVStat );

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

hDC - виртуальній или физический hDC источника изображения на стороне сервиса или DC для отрисовки на стороне клиента

rightX - координата Х левого верхнего угла прямоугольника-источника (относительно окна)

topY - координата Y левого верхнего угла прямоугольника-источника (относительно окна)

widthX - ширина прямоугольника-источника (относительно окна)

heightY - высота прямоугольника-источника (относительно окна)

INVStat - зарезервировано

Функция устанавливает начальные параметры видеопотока. Данную функцию следует вызывать на стороне сервера до того как придет запрос на видеотрансляцию. на стороне клиента вызов данной функции не является обязательным

17. API. Создание интерактивного плейера реального времени

функция параметры
CreateINPRT Синтаксис: void CreateINPRT(Handle hConn, int posX, int POSY, int widthX, int heightY, DWORD styleWin, HWND hParent, LPDWORD lpWin, int LCount, CBSTATUS WMClose);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

posX - The initial horizontal position of the window. For an overlapped or pop-up window, the x parameter is the initial x-coordinate of the window's upper-left corner, in screen coordinates. For a child window, x is the x-coordinate of the upper-left corner of the window relative to the upper-left corner of the parent window's client area. If x is set to CW_USEDEFAULT, the system selects the default position for the window's upper-left corner and ignores the y parameter. CW_USEDEFAULT is valid only for overlapped windows; if it is specified for a pop-up or child window, the x and y parameters are set to zero.

posY - The initial vertical position of the window. For an overlapped or pop-up window, the y parameter is the initial y-coordinate of the window's upper-left corner, in screen coordinates. For a child window, y is the initial y-coordinate of the upper-left corner of the child window relative to the upper-left corner of the parent window's client area. For a list box y is the initial y-coordinate of the upper-left corner of the list box's client area relative to the upper-left corner of the parent window's client area. If an overlapped window is created with the WS_VISIBLE style bit set and the x parameter is set to CW_USEDEFAULT, then the y parameter determines how the window is shown. If the y parameter is CW_USEDEFAULT, then the window manager calls ShowWindow with the SW_SHOW flag after the window has been created. If the y parameter is some other value, then the window manager calls ShowWindow with that value as the nCmdShow parameter.

widthX - The width, in device units, of the window. For overlapped windows, nWidth is the window's width, in screen coordinates, or CW_USEDEFAULT. If nWidth is CW_USEDEFAULT, the system selects a default width and height for the window; the default width extends from the initial x-coordinates to the right edge of the screen; the default height extends from the initial y-coordinate to the top of the icon area. CW_USEDEFAULT is valid only for overlapped windows; if CW_USEDEFAULT is specified for a pop-up or child window, the nWidth and nHeight parameter are set to zero.

heightY - The height, in device units, of the window. For overlapped windows, nHeight is the window's height, in screen coordinates. If the nWidth parameter is set to CW_USEDEFAULT, the system ignores nHeight.

styleWin - стиль окна. более детально о стилях

hParent - A handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid window handle. This parameter is optional for pop-up windows. To create a message-only window, supply HWND_MESSAGE or a handle to an existing message-only window.

lpWin - адресс переменной которая получит значение Handle окна плейера

LCount - условное разделение на горизонтальные блоки. может принимать значения от 1 до 15

WMClose -указатель на функцию которая получит дубликат сообщения WM_CLOSE для окна плейера

Функция должна вызываться на стороне клиента. Согласует параметры передачи видеопотока с сервером с которым должно быть предварительно установлено соединение. создает окно интерактивного проигрывателя и отображает видеопоток в реальном времени

18. API. Инициализация окружения для покадрового видеопотока

функция параметры
StartRemoteINVIST Синтаксис: void StartRemoteINVIST (Handle hConn,
HDC hDC,
int widthX,
int heightY,
int LCount);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

hDC - виртуальный или физический DC для отрисовки на стороне клиента

rightX - координата Х левого верхнего угла прямоугольника-источника (относительно окна)

topY - координата Y левого верхнего угла прямоугольника-источника (относительно окна)

widthX - ширина прямоугольника-источника (относительно окна)

heightY - высота прямоугольника-источника (относительно окна)

LCount - условное разделение на горизонтальные блоки. может принимать значения от 1 до 15

Функция подготавливает окружение на стороне сервера и стороне клиента для трансляции покадрового потока с сервера клиенту. Функция вызывается клиентом

19. API. Получение адресса копии видеопамяти

функция параметры
GetBMPAddr Синтаксис: LPDWORD GetBMPAddr (Handle hConn);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

возвращает указатель на массив данных с битовыми данными растрового изображения

20. API. Отрисовка кадра

функция параметры
GetRemoteINVISTService Синтаксис: void GetRemoteINVISTService (Handle hConn);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection.

Функция получает следующий кадр с сервера и отрисовывает его на DC указанном при вызове StartRemoteINVIST.

21. API. Освобождение памяти занимаемой видеопотоком

функция параметры
StopRemoteINVIST Синтаксис: void StopRemoteINVIST(Handle hConn);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

прекращает видеопоток и освобождает память занятую для видеопотока на стороне сервера и на стороне клиента

22. API. Вертикальная прокрутка мыши

функция параметры
IONMouseVScroll Синтаксис: void IONMouseVScroll(Handle hConn, DWORD UpDown);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

UpDown в случае -1 прокручивает вверх, в противоположном случае - вниз

имитация вертикальной прокрутки колесом мыши

23. API. Нажатие левой кнопки мыши

функция параметры
IONLMouseDown Синтаксис: void IONLMouseDown(Handle hConn, DWORD ScrX, DWORD ScrY );

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

ScrX - абсолютная относительная координата удаленного экрана Х

ScrX - абсолютная относительная координата удаленного экрана Y

Имитация нажатия левой кнопки мыши.

24. API. Нажатие правой кнопки мыши

функция параметры
IONRMouseDown Синтаксис: void IONRMouseDown(Handle hConn, DWORD ScrX, DWORD ScrY );

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

ScrX - абсолютная относительная координата удаленного экрана Х

ScrX - абсолютная относительная координата удаленного экрана Y

Имитация нажатия правой кнопки мыши.

25. API. Отпускание левой кнопки мыши

функция параметры
IONLMouseUp Синтаксис: void IONLMouseUp(Handle hConn, DWORD ScrX, DWORD ScrY );

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

ScrX - абсолютная относительная координата удаленного экрана Х

ScrX - абсолютная относительная координата удаленного экрана Y

имитация нажатия левой кнопки мыши

26. API. Отпускание правой кнопки мыши

функция параметры
IONRMouseUp Синтаксис: void IONRMouseUp(Handle hConn, DWORD ScrX, DWORD ScrY );

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

ScrX - абсолютная относительная координата удаленного экрана Х

ScrX - абсолютная относительная координата удаленного экрана Y

имитация нажатия правой кнопки мыши

27. API. Перемещение указателя мыши

функция параметры
IONMouseMove Синтаксис: void IONMouseMove(Handle hConn, DWORD ScrX, DWORD ScrY , int StepMove);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

ScrX - абсолютная относительная координата удаленного экрана Х

ScrX - абсолютная относительная координата удаленного экрана Y

StepMove - зарезервировано

имитация перемещения указателя мыши в заданную позицию

28. API. Нажатие кнопки клавиатуры

функция параметры
IONKeyDown Синтаксис: void IONKeyDown(Handle hConn, DWORD VKey);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

VKey virtual key-code нажатой кнопки

имитация нажатия кнопки клавиатуры

29. API. Отпускание кнопки клавиатуры

функция параметры
IONKeyUp Синтаксис: void IONKeyUp(Handle hConn, DWORD VKey);

hConn - дескриптор полученый функцией CreateIONHandle или IONWaitConnection

VKey virtual key-code нажатой кнопки

Имитация отпускания кнопки клавиатуры

30. API. Запуск консольного приложения с перенаправленным вводом-выводом

функция параметры
StartHiddenConsoleProcess Синтаксис: void StartHiddenConsoleProcess(LPVOID pCMDLine, PHANDLE pOutPipe, PHANDLE pInPipe, PHANDLE pCOutPipe, PHANDLE pCInPipe);

pCMDLine - указатель на ASCIIZ (заканчивающуюся нулем) строку с именем запускаемого консольного приложения

pOutPipe указатель на переменную которая получит хендл пайпа для вывода

pInPipe указатель на переменную которая получит хендл пайпа для ввода

pСOutPipe указатель на переменную которая получит хендл пайпа для вывода на стороне консоли

pСInPipe указатель на переменную которая получит хендл пайпа для ввода на стороне консоли

31. API. Отправка комманды в консоль

функция параметры
SendCommandLine Синтаксис: void SendCommandLine(HANDLE hOutpipe, LPVOID pCOMCline);

hOutpipe - хендл пайпа для вывода, который вернула функция StartHiddenConsoleProcess

pCOMCline указатель на коммандную строку, заканчивающуюся тремя символами 0x0D, 0x0A, 0x00

32. API. Сохранить копию удаленного DC в BMP

функция параметры
SaveINVISTtoBPM Синтаксис: int SaveINVISTtoBPM(HANDLE hConn, LPVOID pFName);

hConn - хендл полученный функцией CreateIONHandle

pFName ASCIIZ строка содержащая имя bmp файла

Пример 1. Обмен файлами за NAT

// обмен файлами почти неограниченного размера между клиентами за NAT
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\WORK\\P2P\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\WORK\P2P\HEREDES\heredes.h>

int main(void)
{
	InitIONLibrary();	// инициализация библиотек и интерфейсов HEREDES
	DWORD Valid = 0;
	DWORD Id = 0;
	DWORD HightDword = 0;

	RegIONId(&Valid, &Id);	// регистрация нового пользователя
	// запуск асинхроннго сервера для ожидания входящих соединений
	HANDLE hConn = IONWaitConnection(&Valid, &Id, NULL);

	// запуск синхронного интерфейса для передачи файла
	DWORD lowDword = IONSendFileToId(&Valid, &Id, NULL, &HightDword);

	IONTerminate(hConn);   // прерывание ожидания входящих соединений
	CloseIONHandle(hConn);
	return 0;
}
Скачать скомпилированный пример 1

Пример 2. Простой UDP сервер и UDP клиент за NAT


      //UDP сервер, который в течении минуты слушает сеть и ожидает входящих соединений
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\HEREDES\heredes.h>

int main(void)
{
	InitIONLibrary();	//инициализация библиотек и интерфейсов HEREDES
	DWORD Valid = 0;
	DWORD Id = 0;
	DWORD HightDword = 0;

	RegIONId(&Valid, &Id);	//регистрация нового пользователя

	//запуск асинхроннго сервера для ожидания входящих соединений
	HANDLE hConn = IONWaitConnection(&Valid, &Id, NULL);
	HANDLE hEv=CreateEventA(NULL,1,NULL,NULL);
	
	WaitForSingleObject(hEv,60000);
	CloseHandle(hEv);

	IONTerminate(hConn); //прерывание ожидания входящих соединений
	CloseIONHandlw(hConn); //прерывание ожидания входящих соединений
	
	return 0;
}

//простейший UDP клиент, который ничего не делает
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\HEREDES\heredes.h>

int main(void)
{
	InitIONLibrary();		//инициализация библиотек и интерфейсов HEREDES
	CHAR SecKey[8];		//8-ми байтный массив с ключем шифрования
	DWORD Valid = 0;
	DWORD Id = 0;
	HANDLE hConn;
	RegIONId(&Valid, &Id);	//регистрация нового пользователя
	
	
	hConn=CreateIONHandle();
		if (IONConnectToId(hConn, NULL, &Valid, &Id, &SecKey, NULL, NULL, NULL)==TRUE){
				MessageBoxA(NULL,"коннет установлен","состояние подключения", 48);
				HANDLE hEv=CreateEventA(NULL,1,NULL,NULL);
				WaitForSingleObject(hEv,60000);
				CloseHandle(hEv);

		}else{
				MessageBoxA(NULL,"ошибка соединения","состояние подключения", 48);
		};

	IONDisconnect(hConn); //прерывание ожидания входящих соединений
	CloseIONHandle(hConn); //прерывание ожидания входящих соединений
	return 0;
}

Пример 3. МФУ или клиент и сервер в одном лице

//клиент-сервер over NAT
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\HEREDES\heredes.h>


int main(void)
{
	InitIONLibrary();			//инициализация библиотек и интерфейсов HEREDES

	CHAR SecKey[8];			//8-ми байтный массив с ключем шифрования
	DWORD Valid = 0;
	DWORD Id = 0;
	RegIONId(&Valid, &Id);		//регистрация нового пользователя


	HANDLE hCON_IN=IONWaitConnection(&Valid, &Id, NULL);
	HANDLE hCON_OUT=CreateIONHandle();


	if (IONConnectToId(hCON_OUT, NULL, &Valid, &Id, &SecKey, NULL, NULL, NULL==TRUE)){

		



		}else{
		MessageBoxA(NULL,"ошибка соединения","состояние подключения", 48);
		};

		IONTerminate(hCON_IN);
		IONDisconnect(hCON_OUT);
		CloseIONHandle(hCON_IN);
		CloseIONHandle(hCON_OUT);
	FreeConsole();
	return 0;
}
      

Пример 4. Простой консольный мессенджер за NAT

//написать за NAT
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\HEREDES\heredes.h>

HANDLE hOutput;
CBUDATA __stdcall UserDataProc(HANDLE hConn, LPVOID pAddrUserData, int datSize)
{
	DWORD inSize;
	WriteConsoleA(hOutput,pAddrUserData, datSize, &inSize, NULL);
	return 0;
}

int main(void)
{
	InitIONLibrary();				//инициализация библиотек и интерфейсов HEREDES

	CHAR buffer[0x3E0];			//максимальный размер блока пользовательских данных 0х3Е0
	DWORD bSize=0;

	CHAR SecKey[8];			//8-ми байтный массив с ключем шифрования
	DWORD Valid = 0;
	DWORD Id = 0;
	RegIONId(&Valid, &Id);		//регистрация нового пользователя

	AllocConsole();
	HANDLE hInput=GetStdHandle(-10);
	hOutput=GetStdHandle(-11);


	HANDLE hCON_IN=IONWaitConnection(&Valid, &Id, (CBUDATA) &UserDataProc);
	HANDLE hCON_OUT=CreateIONHandle();


	if (IONConnectToId(hCON_OUT, NULL, &Valid, &Id, &SecKey, \
			NULL, NULL, (CBUDATA) &UserDataProc)==TRUE){


			while (bSize!=-1){
				ReadConsoleA(hInput,&buffer,0x3E0,&bSize,NULL);
				if (IONGetStatus(hCON_OUT)==6) {SendUserData(hCON_OUT,&buffer,bSize);};
				if (IONGetStatus(hCON_IN)==6) {SendUserData(hCON_IN,&buffer,bSize);};
						}
				
		}else{
				MessageBoxA(NULL,"ошибка соединения","состояние подключения", 48);
		};

		IONTerminate(hCON_IN);
		IONDisconnect(hCON_OUT);
		CloseIONHandle(hCON_IN);
		CloseIONHandle(hCON_OUT);
	FreeConsole();
	return 0;
}
      
Скачать скомпилированный пример 4

Пример 5. Простая звоника за NAT
//поговорить за NAT
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\HEREDES\heredes.h>


int main(void)
{
	InitIONLibrary();			//инициализация библиотек и интерфейсов HEREDES

	CHAR SecKey[8];			//8-ми байтный массив с ключем шифрования
	DWORD Valid = 0;
	DWORD Id = 0;
	RegIONId(&Valid, &Id);		//регистрация нового пользователя


	HANDLE hCON_IN=IONWaitConnection(&Valid, &Id, NULL);
	HANDLE hCON_OUT=CreateIONHandle();

	
	IONSetAudioParam(hCON_OUT,3,"aud_in.wav","aud_sp.wav",NULL);
	IONSetAudioParam(hCON_IN,3,"aud_in.wav","aud_sp.wav",NULL);


		if (IONConnectToId(hCON_OUT, NULL, &Valid, &Id, &SecKey, NULL, NULL, NULL)==TRUE){

			IONStartAudioStream(hCON_OUT,11025);
			HANDLE hEv=CreateEventA(NULL,1,NULL,NULL);
			WaitForSingleObject(hEv,60000);
			CloseHandle(hEv);

			
		}else{
				MessageBoxA(NULL,"ошибка соединения","состояние подключения", 48);
		};
		IONStopAudioStream(hCON_IN);
		IONStopAudioStream(hCON_OUT);
		IONTerminate(hCON_IN);
		IONDisconnect(hCON_OUT);
		CloseIONHandle(hCON_IN);
		CloseIONHandle(hCON_OUT);
	return 0;
}
      
Скачать скомпилированный пример 5

Пример 6. От разговоров к администрированию или CMD over NAT

//CMD за NAT
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\HEREDES\heredes.h>

CHAR buffer[0x3E0];			//максимальный размер блока пользовательских данных 0х3Е0
HANDLE hOutput;
HANDLE outpipe;
HANDLE inpipe;
HANDLE hEv;
HANDLE hCON_IN;
HANDLE hCON_OUT;

CBUDATA __stdcall UserDataProc(HANDLE hConn, LPVOID pAddrUserData, int datSize)
{
	
	DWORD cRcv=1;
	if (IONGetStatus(hCON_IN)==6){
		SendCommandLine(outpipe,pAddrUserData);
		WaitForSingleObject(hEv,2000);
		
			while(cRcv!=0){
				PeekNamedPipe(inpipe,NULL,NULL,NULL,&cRcv,NULL);
				if (cRcv!=0){
					ReadFile(inpipe,&buffer,cRcv,&cRcv,NULL);
					}
				SendUserData(hCON_IN,&buffer,cRcv);
				}
	};

	if (IONGetStatus(hCON_OUT)==6){
				WriteConsoleA(hOutput,pAddrUserData,datSize,&cRcv,NULL);
			
	};



	DWORD inSize;
	WriteConsoleA(hOutput,pAddrUserData, datSize, &inSize, NULL);
	return 0;
}

int main(void)
{
	HANDLE hInCons;
	HANDLE hOutCons;
	
	hEv=CreateEventA(NULL,1,NULL,NULL);
	StartHiddenConsoleProcess("cmd.exe",&outpipe, &inpipe, &hOutCons, &hInCons);

	InitIONLibrary();			//инициализация библиотек и интерфейсов HEREDES

	DWORD bSize=0;

	CHAR SecKey[8];			//8-ми байтный массив с ключем шифрования
	DWORD Valid = 0;
	DWORD Id = 0;
	RegIONId(&Valid, &Id);		//регистрация нового пользователя



	hCON_IN=IONWaitConnection(&Valid, &Id, (CBUDATA) &UserDataProc);
	hCON_OUT=CreateIONHandle();


	if (IONConnectToId(hCON_OUT, NULL, &Valid, &Id, &SecKey, \
			NULL, NULL, (CBUDATA) &UserDataProc)==TRUE){

			
			AllocConsole();
			HANDLE hInput=GetStdHandle(-10);
			hOutput=GetStdHandle(-11);
			WriteConsoleA(hOutput,"REMOTE CMD >",12,&bSize,NULL);


			while (bSize!=-1){
				ReadConsoleA(hInput,&buffer,0x3E0,&bSize,NULL);
				SendUserData(hCON_OUT,&buffer,bSize);
						}
				
			FreeConsole();

		}else{
				MessageBoxA(NULL,"ошибка соединения","состояние подключения", 48);
		};

		IONTerminate(hCON_IN);
		IONDisconnect(hCON_OUT);
		CloseIONHandle(hCON_IN);
		CloseIONHandle(hCON_OUT);
	return 0;
}
      
Скачать скомпилированный пример 6

Пример 7. Займемся фотографией. Сфоткаем часть экрана удаленного рабочего стола

//безголовый скрин
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\HEREDES\heredes.h>


int main(void)
{
	InitIONLibrary();			//инициализация библиотек и интерфейсов HEREDES

	CHAR SecKey[8];			//8-ми байтный массив с ключем шифрования
	DWORD Valid = 0;
	DWORD Id = 0;
	RegIONId(&Valid, &Id);		//регистрация нового пользователя

	HDC hCDC;
	HDC hDC=GetDC(NULL);
	HANDLE hCON_IN=IONWaitConnection(&Valid, &Id, NULL);
	HANDLE hCON_OUT=CreateIONHandle();
	SetINVISTParam(hCON_IN,hDC,64, 64, 256, 256,NULL);//установим параметры прямоугольника
																		//разрешенного для отправки по сети


	if (IONConnectToId(hCON_OUT, NULL, &Valid, &Id, &SecKey, NULL, NULL, NULL)==TRUE)
		{
			hCDC=CreateCompatibleDC(hDC);
			StartRemoteINVIST(hCON_OUT,hCDC,512, 512, 1);	//размеры изображения
										//я решил увеличить,
																		//но можно было оставить и оригинальные или напротив уменьшить
			
	for (int i=0; i<3; i++){GetRemoteINVISTService(hCON_OUT);};	//получаю видео из 3х кадра
										//из за специфики кодека
			int sB=SaveINVISTtoBPM(hCON_OUT,"screen.bmp");


		}else{
		MessageBoxA(NULL,"ошибка соединения","состояние подключения", 48);
		};
		DeleteDC(hCDC);
		IONTerminate(hCON_IN);
		IONDisconnect(hCON_OUT);
		CloseIONHandle(hCON_IN);
		CloseIONHandle(hCON_OUT);

	return 0;
}
      
Скачать скомпилированный пример 7

Пример 8. Свой маленький TeamViewer

//свой маленький TeamViewer
#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#pragma comment(lib, "C:\\HEREDES\\heredes.lib")
#include <windows.h>
#include <C:\HEREDES\heredes.h>

HANDLE hEv;
WNDPROC __stdcall ProcClose(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

	SetEvent(hEv);

	return 0;
}

int main(void)
{
	hEv=CreateEventA(NULL,1,NULL,NULL);
	InitIONLibrary();			//инициализация библиотек и интерфейсов HEREDES

	CHAR SecKey[8];			//8-ми байтный массив с ключем шифрования
	DWORD Valid = 0;
	DWORD Id = 0;
	RegIONId(&Valid, &Id);		//регистрация нового пользователя

	HDC hCDC;
	HDC hDC=GetDC(NULL);
	HANDLE hCON_IN=IONWaitConnection(&Valid, &Id, NULL);
	HANDLE hCON_OUT=CreateIONHandle();
	SetINVISTParam(hCON_IN,hDC,64, 64, GetSystemMetrics(0), GetSystemMetrics(1),NULL);					//установим параметры прямоугольника
	
	if (IONConnectToId(hCON_OUT, NULL, &Valid, &Id, &SecKey, NULL, NULL, NULL)==TRUE)
		{
	hCDC=CreateCompatibleDC(hDC);
	StartRemoteINVIST(hCON_OUT,hCDC,512, 512, 1);	//размеры изображения я решил увеличить,
																		//но можно было оставить и оригинальные или напротив уменьшить
			HWND hWin;
			CreateINPRT(hCON_OUT, 64, 32, 512, 300, 0x00CF0000, NULL, &hWin, 1, (WNDPROC) ProcClose);

			WaitForSingleObject(hEv,-1);

		}else{
		MessageBoxA(NULL,"ошибка соединения","состояние подключения", 48);
		};
		
		CloseHandle(hEv);
		IONTerminate(hCON_IN);
		IONDisconnect(hCON_OUT);
		CloseIONHandle(hCON_IN);
		CloseIONHandle(hCON_OUT);

	return 0;
}
      
Скачать скомпилированный пример 8