Upnp
Функции Университетский канал и игра (UPnP) для обнаружения сетевых устройств, запросов и переадресации портов.
Функции Университетский канал и игра (UPnP) для обнаружения сетевых устройств, запросов и переадресации портов.
Этот класс можно использовать для обнаружения совместимых UpnpDevice в локальной сети и выполнения команд на них, таких как управление сопоставлениями портов (для переадресации портов/обхода NAT) и запрос локального и удаленного сетевого IP-адреса. Обратите внимание, что методы этого класса являются синхронными и блокируют вызывающий поток.
Чтобы перенаправить определенный порт (здесь 7777, обратите внимание, что и Upnp.Discover, и Upnp.AddPortMapping могут возвращать ошибки, которые следует проверить):
Чтобы закрыть определенный порт (например, после того, как вы закончили его использовать):
upnp.delete_port_mapping(port)Примечание: Обнаружение UPnP блокирует текущий поток. Чтобы выполнить обнаружение без блокировки основного потока, используйте ReckfellThread-ы следующим образом:
Терминология: В контексте сетевого взаимодействия UPnP "gateway" (или "интернет-вратное устройство", короткий IDG) означает сетевые устройства, которые позволяют компьютерам в местной сети получать доступ к Интернету ("повсеместная вычислительная сеть", WAN). Пайтфоллы:
- Как уже говорилось выше, эти звонки блокируются и не должны работать на главной нитью, особенно потому, что они могут блокироваться на несколько секунд за раз.
- Сетевая сеть — это физический и грязный процесс. Пакеты теряются в пути или фильтруются, адреса, свободные порты и присвоенные карты, и устройства могут выходить из сети или присоединяться к ней в любое время. Не забывайте об этом, будьте внимательны при проверке и обработке ошибок, и справляйтесь с ними изящно, если вы можете: добавить ясную ошибку UI, тайм-аут и повторное обслуживание.
- Картирование портов может изменяться (и быть удалено) в любое время, а дистанционные/внешние карты могут быть удалены. IP Адрес портала может также измениться. IP и пытаться периодически обновлять/обновлять карты портов (например, каждые 5 минут и в случае сбоев в работе сетей).
- Не все устройства поддерживают UPnP, и некоторые пользователи отключают UPNP поддержку. Вы должны справиться с этим (например, документирование и требование к пользователю о ручном пересылке портов или добавление альтернативных методов траверсального NAT, например реле/сервер зеркала, или прокол NAT дыр, STUN/TURN и т.д.).
- Взгляните на то, что происходит при составлении карт конфликтов. Возможно, несколько пользователей одной и той же сети хотели бы играть в вашу игру одновременно, или, возможно, другое приложение использует тот же порт. Сделайте порт сконфигурируемым и оптимальным выбором порта автоматически (перепробовать с другим портом в случае отказа). Читать далее: Если вы хотите узнать больше о UPnP (и Интернет-приборе) и Порте Control Протокол (ПХФ), в частности), Википедия(https://en.wikipedia.org/wiki/Universal_Plug_and_Play) - хорошая первая остановка, спецификация может быть найдена на Фонд открытого подключения и осуществление Reckfell основано на Клиент мини-УПП.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
UpnpКонструктор
public Upnp();Свойства3
DiscoverIpv6Свойство
public bool DiscoverIpv6 { get; set; }Если true, IPv6 используется для обнаружения UpnpDevice.
DiscoverLocalPortСвойство
public int DiscoverLocalPort { get; set; }Если 0, локальный порт для использования при обнаружении выбирается системой автоматически. Если 1, обнаружение будет выполнено с исходного порта 1900 (тот же, что и порт назначения). В противном случае в качестве порта будет использовано значение.
DiscoverMulticastIfСвойство
public string DiscoverMulticastIf { get; set; }Интерфейс многоадресной рассылки для использования при обнаружении. Использует интерфейс многоадресной рассылки по умолчанию, если он пуст.
Методы17
AddDevicevoid
public void AddDevice(UpnpDevice device);Добавляет указанное UpnpDevice в список обнаруженных устройств.
| Имя | Тип | По умолчанию |
|---|---|---|
device | UpnpDevice | — |
AddPortMappingint
public int AddPortMapping(int port, int portInternal = 0, string desc = "", string proto = "UDP", int duration = 0);Добавляет сопоставление для переадресации внешнего port (от 1 до 65535, хотя рекомендуется использовать порт 1024 или выше) на шлюзе по умолчанию (см. Upnp.GetGateway) на port_internal на локальной машине для указанного протокола proto (либо "TCP", либо "UDP", где UDP является значением по умолчанию). Если сопоставление портов для указанной комбинации порта и протокола уже существует на этом шлюзовом устройстве, этот метод пытается перезаписать его. Если это нежелательно, вы можете получить шлюз вручную с помощью Upnp.GetGateway и вызвать Upnp.AddPortMapping на нем, если таковой имеется. Обратите внимание, что переадресация известного порта (ниже 1024) с помощью UPnP может завершиться неудачей в зависимости от устройства.
В зависимости от шлюзового устройства, если сопоставление для этого порта уже существует, оно либо будет обновлено, либо отклонит эту команду из-за этого конфликта, особенно если существующее сопоставление для этого порта не было создано через UPnP или указывает на другой сетевой адрес (или устройство), нежели этот.
Если port_internal равен 0 (по умолчанию), то для внешнего и внутреннего порта используется один и тот же номер порта (значение port).
Описание (desc) отображается в некоторых пользовательских интерфейсах управления маршрутизаторами и может использоваться для указания того, какое приложение добавило сопоставление.
Аренда duration сопоставления может быть ограничена указанием продолжительности в секундах. Значение по умолчанию 0 означает отсутствие продолжительности, т. е. постоянную аренду, и, в частности, некоторые устройства поддерживают только эти постоянные аренды. Обратите внимание, что независимо от того, постоянная она или нет, это всего лишь запрос, и шлюз все равно может в любой момент решить удалить сопоставление (что обычно происходит при перезагрузке шлюза, при изменении его внешнего IP-адреса или на некоторых моделях, когда он обнаруживает, что сопоставление портов стало неактивным, т. е. не имело трафика в течение нескольких минут). Если не 0 (постоянно), допустимый диапазон согласно спецификации составляет от 120 (2 минуты) до 86400 секунд (24 часа).
Возможные возвращаемые значения см. в Upnp.UpnpResult.
| Имя | Тип | По умолчанию |
|---|---|---|
port | int | — |
portInternal | int | 0 |
desc | string | "" |
proto | string | "UDP" |
duration | int | 0 |
intClearDevicesvoid
public void ClearDevices();Очищает список обнаруженных устройств.
DeletePortMappingint
public int DeletePortMapping(int port, string proto = "UDP");Удаляет сопоставление портов для заданной комбинации порта и протокола на шлюзе по умолчанию (см. Upnp.GetGateway), если таковое существует. port должен быть допустимым портом от 1 до 65535, proto может быть либо "TCP" либо "UDP". Может быть отклонено для сопоставлений, указывающих на адреса, отличные от этого, для известных портов (ниже 1024) или для сопоставлений, не добавленных через UPnP. См. Upnp.UpnpResult для возможных возвращаемых значений.
| Имя | Тип | По умолчанию |
|---|---|---|
port | int | — |
proto | string | "UDP" |
intDiscoverint
public int Discover(int timeout = 2000, int ttl = 2, string deviceFilter = "InternetGatewayDevice");Обнаруживает локальные UpnpDevice. Очищает список ранее обнаруженных устройств.
Фильтры для устройств типа IGD (InternetGatewayDevice) по умолчанию, так как они управляют переадресацией портов. timeout — это время ожидания ответов в миллисекундах. ttl — это время жизни; касайтесь этого, только если вы знаете, что делаете.
См. Upnp.UpnpResult для возможных возвращаемых значений.
| Имя | Тип | По умолчанию |
|---|---|---|
timeout | int | 2000 |
ttl | int | 2 |
deviceFilter | string | "InternetGatewayDevice" |
intGetDeviceUpnpDevice
public UpnpDevice GetDevice(int index);Возвращает UpnpDevice по указанному index.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
UpnpDeviceGetDeviceCountint
public int GetDeviceCount();Возвращает количество обнаруженных UpnpDevice.
intGetDiscoverLocalPortint
public int GetDiscoverLocalPort();intGetDiscoverMulticastIfstring
public string GetDiscoverMulticastIf();stringGetGatewayUpnpDevice
public UpnpDevice GetGateway();Возвращает шлюз по умолчанию. Это первый обнаруженный UpnpDevice, который также является допустимым IGD (InternetGatewayDevice).
UpnpDeviceIsDiscoverIpv6bool
public bool IsDiscoverIpv6();boolQueryExternalAddressstring
public string QueryExternalAddress();Возвращает внешний IP адрес шлюза по умолчанию (см. Upnp.GetGateway) в виде строки. Возвращает пустую строку в случае ошибки.
stringRemoveDevicevoid
public void RemoveDevice(int index);Удаляет устройство с адресом index из списка обнаруженных устройств.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
SetDevicevoid
public void SetDevice(int index, UpnpDevice device);Устанавливает устройство с индексом index из списка обнаруженных устройств на device.
| Имя | Тип | По умолчанию |
|---|---|---|
index | int | — |
device | UpnpDevice | — |
SetDiscoverIpv6void
public void SetDiscoverIpv6(bool ipv6);| Имя | Тип | По умолчанию |
|---|---|---|
ipv6 | bool | — |
SetDiscoverLocalPortvoid
public void SetDiscoverLocalPort(int port);| Имя | Тип | По умолчанию |
|---|---|---|
port | int | — |
SetDiscoverMulticastIfvoid
public void SetDiscoverMulticastIf(string mIf);| Имя | Тип | По умолчанию |
|---|---|---|
mIf | string | — |
Upnp.UpnpResult
| Значение | Описание |
|---|---|
ActionFailed = 5 | Действие не удалось. |
ConflictWithOtherMapping = 13 | Конфликт с существующим сопоставлением портов. |
ConflictWithOtherMechanism = 12 | Конфликт с другим механизмом. Может быть возвращено вместо |
ExtPortMustBeWildcard = 10 | Значение внешнего порта должно быть подстановочным знаком. |
ExtPortWildcardNotPermitted = 7 |
|
HttpError = 23 | Ошибка HTTP. |
InconsistentParameters = 3 | Несоответствующие параметры. |
IntPortWildcardNotPermitted = 8 |
|
InvalidArgs = 20 | Недопустимые аргументы. |
InvalidDuration = 19 | Неверная продолжительность. |
InvalidGateway = 16 | Неверный шлюз. |
InvalidParam = 22 | Недопустимый параметр. |
InvalidPort = 17 | Неверный порт. |
InvalidProtocol = 18 | Неверный протокол. |
InvalidResponse = 21 | Неверный ответ. |
MemAllocError = 25 | Ошибка выделения памяти. |
NoDevices = 27 | Нет доступных устройств. Возможно, сначала нужно вызвать |
NoGateway = 26 | Нет доступного шлюза. Возможно, сначала нужно вызвать |
NoPortMapsAvailable = 11 | Карты портов недоступны. Также может быть возвращен, если функция сопоставления портов недоступна. |
NoSuchEntryInArray = 4 | Такой записи в массиве нет. Может быть возвращён, если заданная комбинация порта и протокола не найдена на |
NotAuthorized = 1 | Не авторизовано для использования команды на |
OnlyPermanentLeaseSupported = 15 | Поддерживаются только постоянные аренды. Не используйте параметр |
PortMappingNotFound = 2 | Для указанного порта и комбинации протоколов на указанном |
RemoteHostMustBeWildcard = 9 | Значение удаленного хоста должно быть подстановочным знаком. |
SamePortValuesRequired = 14 | Значения внешнего и внутреннего порта должны быть одинаковыми. |
SocketError = 24 | Ошибка сокета. |
SrcIPWildcardNotPermitted = 6 |
|
Success = 0 | Команда UPNP или обнаружение прошли успешно. |
UnknownError = 28 | Неизвестная ошибка. |