Spec-Zone.ru › Nim

std/net

SourceEdit

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

Первое, что вам всегда нужно сделать, чтобы начать использовать сокеты, это создать новый экземпляр типа Socket с помощью процедуры newSocket.

SSL

Для использования процедур SSL, определенных в этом модуле, необходимо скомпилировать ваше приложение со флагом -d:ssl. Дополнительные сведения см. в процедуре newContext.

SSL на Windows

В Windows библиотека SSL проверяет действительность сертификатов. Для этой цели она использует файл cacert.pem, который был извлечен из https://curl.se/ca/cacert.pem. Помимо DLL-библиотек OpenSSL (например, libssl-1_1-x64.dll, libcrypto-1_1-x64.dll), вам также необходимо включить cacert.pem в ваш файл .exe.

Примеры

Подключение к серверу

После создания сокета с помощью процедуры newSocket, вы можете легко подключить его к серверу, работающему на известном имени хоста (или IP-адресе) и порту. Для этого по протоколу TCP используйте пример ниже.

Пример: cmd: -r:off

import std/net
let socket = newSocket()
socket.connect("google.com", Port(80))
Для SSL используйте следующий пример:

Пример: cmd: -r:off -d:ssl

import std/net
let socket = newSocket()
let ctx = newContext()
wrapSocket(ctx, socket)
socket.connect("google.com", Port(443))
Протокол UDP является бессостоятельным, поэтому сокеты UDP не должны явно вызывать процедуру connect. Они могут просто начать отправку данных сразу.

Пример: cmd: -r:off

import std/net
let socket = newSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
socket.sendTo("192.168.0.1", Port(27960), "status\n")

Пример: cmd: -r:off

import std/net
let socket = newSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
let ip = parseIpAddress("192.168.0.1")
doAssert socket.sendTo(ip, Port(27960), "status\c\l") == 8

Создание сервера

После создания сокета с помощью процедуры newSocket, вы можете создать сервер TCP, вызвав процедуры bindAddr и listen.

Пример: cmd: -r:off

import std/net
let socket = newSocket()
socket.bindAddr(Port(1234))
socket.listen()

# You can then begin accepting connections using the `accept` procedure.
var client: Socket
var address = ""
while true:
  socket.acceptAddr(client, address)
  echo "Client connected from: ", address

Импорты

since, nativesockets, os, strutils, times, sets, options, monotimes, ssl_config, winlean, openssl, ssl_certs, winlean

Типы

Certificate = string
DER-закодированный сертификат Source Edit
IpAddress = object
  case family*: IpAddressFamily ## the type of the IP address (IPv4 or IPv6)
  of IpAddressFamily.IPv6:
    address_v6*: array[0 .. 15, uint8] ## Contains the IP address in bytes in
                                       ## case of IPv6
  of IpAddressFamily.IPv4:
    address_v4*: array[0 .. 3, uint8] ## Contains the IP address in bytes in
                                      ## case of IPv4
хранит произвольный IP-адрес Source Edit
IpAddressFamily {.pure.} = enum
  IPv6,                     ## IPv6 address
  IPv4                       ## IPv4 address
Описывает тип IP-адреса Source Edit
ReadLineResult = enum
  ReadFullLine, ReadPartialLine, ReadDisconnected, ReadNone
результат для readLineAsync Source Edit
SOBool = enum
  OptAcceptConn, OptBroadcast, OptDebug, OptDontRoute, OptKeepAlive,
  OptOOBInline, OptReuseAddr, OptReusePort, OptNoDelay
Логические параметры сокета. Source Edit
Socket = ref SocketImpl
Source Edit
SocketFlag {.pure.} = enum
  Peek, SafeDisconn          ## Ensures disconnection exceptions (ECONNRESET, EPIPE etc) are not thrown.
Source Edit
SocketImpl = object
  when defineSsl:
  ## stores the last error on this socket
тип сокета Source Edit
SslAcceptResult = enum
  AcceptNoClient = 0, AcceptNoHandshake, AcceptSuccess
Source Edit
SslClientGetPskFunc = proc (hint: string): tuple[identity: string, psk: string]
Source Edit
SslContext = ref object
  context*: SslCtx
Source Edit
SslCVerifyMode = enum
  CVerifyNone, CVerifyPeer, CVerifyPeerUseEnvVars
Source Edit
SslError = object of CatchableError
Source Edit
SslHandshakeType = enum
  handshakeAsClient, handshakeAsServer
Source Edit
SslProtVersion = enum
  protSSLv2, protSSLv3, protTLSv1, protSSLv23
Source Edit
SslServerGetPskFunc = proc (identity: string): string
Source Edit
TimeoutError = object of CatchableError
Source Edit

Константы

BufferSize: int = 4000
размер буфера буферизованного сокета Source Edit
MaxLineLength = 1000000
Source Edit

Процедуры

proc `$`(address: IpAddress): string {....raises: [], tags: [], forbids: [].}
Преобразует IpAddress в текстовое представление Исходный код Редактировать
proc `==`(lhs, rhs: IpAddress): bool {....raises: [], tags: [], forbids: [].}
Сравнивает два IpAddress на равенство. Возвращает true, если адреса равны Исходный код Редактировать
proc accept(server: Socket; client: var owned(Socket); flags = {SafeDisconn};
            inheritable = defined(nimInheritHandles)) {....tags: [ReadIOEffect],
    raises: [OSError, IOError, SslError], forbids: [].}

Эквивалентно acceptAddr, но не возвращает адрес, только сокет.

Обработчик сокета (SocketHandle), связанный с полученным клиентом, по умолчанию не будет наследуем дочерними процессами. Это можно изменить с помощью параметра inheritable.

Вызов accept может привести к ошибке, если соединяющийся сокет прерывает соединение в течение выполнения accept. Если задан флаг SafeDisconn, эта ошибка не будет поднята, а вместо этого будет вызван accept снова.

Исходный код Редактировать
proc acceptAddr(server: Socket; client: var owned(Socket); address: var string;
                flags = {SafeDisconn}; inheritable = defined(nimInheritHandles)) {.
    ...tags: [ReadIOEffect], gcsafe, raises: [OSError, IOError, SslError],
    forbids: [].}

Ожидает подключения от клиента. При подключении устанавливает client в сокет клиента и address в адрес подключающегося клиента. Эта функция вызывает OSError в случае возникновения ошибки.

Полученный клиент унаследует любые свойства серверного сокета. Например, буферизован ли сокет или нет.

Обработчик сокета (SocketHandle), связанный с полученным клиентом, по умолчанию не будет наследуем дочерними процессами. Это можно изменить с помощью параметра inheritable.

Вызов accept может привести к ошибке, если соединяющийся сокет прерывает соединение в течение выполнения accept. Если задан флаг SafeDisconn, эта ошибка не будет поднята, а вместо этого будет вызван accept снова.

Исходный код Редактировать
proc bindAddr(socket: Socket; port = Port(0); address = "") {.
    ...tags: [ReadIOEffect], raises: [ValueError, OSError], forbids: [].}

Связывает address:port с сокетом.

Если address равно "" , то будет связан ADDR_ANY.

Исходный код Редактировать
proc bindUnix(socket: Socket; path: string) {....raises: [], tags: [], forbids: [].}
Связывает Unix-сокет с path. Это работает только в системах Unix-подобного типа: Mac OS X, BSD и Linux Исходный код Редактировать
proc clientGetPskFunc(ctx: SslContext): SslClientGetPskFunc {....raises: [],
    tags: [], forbids: [].}
Исходный код Редактировать
proc clientGetPskFunc=(ctx: SslContext; fun: SslClientGetPskFunc) {....raises: [],
    tags: [], forbids: [].}

Устанавливает функцию, возвращающую идентификатор клиента и предварительно согласованный ключ (PSK) на основе подсказки идентификатора от сервера.

Используется только в криптографических наборах с предварительно согласованными ключами (PSK).

Исходный код Редактировать
proc close(socket: Socket; flags = {SafeDisconn}) {.
    ...raises: [LibraryError, Exception, SslError, OSError], tags: [RootEffect],
    forbids: [].}

Закрывает сокет.

Если socket является SSL/TLS-сокет, эта процедура также отправит уведомление о закрытии партнёру. Если SafeDisconn находится в flags, ошибки при этом из-за разрыва соединения будут проигнорированы. Это, как правило, безопасно на практике. Подробнее см. здесь.

Исходный код Редактировать
proc connect(socket: Socket; address: string; port = Port(0)) {.
    ...tags: [ReadIOEffect, RootEffect], raises: [OSError, SslError], forbids: [].}

Подключает сокет к address:port. Address может быть IP-адресом или именем хоста. Если address является именем хоста, эта функция попробует каждый IP-адрес этого имени хоста. htons уже выполняется на port, поэтому вы не должны это делать.

Если socket является SSL-сокет, будет автоматически выполнен рукопожатие.

Исходный код Редактировать
proc connect(socket: Socket; address: string; port = Port(0); timeout: int) {.
    ...tags: [ReadIOEffect, WriteIOEffect, RootEffect],
    raises: [OSError, TimeoutError], forbids: [].}

Подключается к серверу, указанному в address, на порту, указанном в port.

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

Исходный код Редактировать
proc connectUnix(socket: Socket; path: string) {....raises: [], tags: [],
    forbids: [].}
Подключается к Unix-сокету по адресу path. Это работает только в системах Unix-подобного типа: Mac OS X, BSD и Linux Исходный код Редактировать
proc destroyContext(ctx: SslContext) {....raises: [SslError], tags: [], forbids: [].}
Освобождает память, на которую ссылается SslContext. Исходный код Редактировать
proc dial(address: string; port: Port; protocol = IPPROTO_TCP; buffered = true): owned(
    Socket) {....tags: [ReadIOEffect, WriteIOEffect], raises: [OSError, IOError],
              forbids: [].}
Устанавливает соединение с указанной парой address:port через указанный протокол. Процедура перебирает возможные разрешения address до тех пор, пока не достигнет успеха, что означает, что она беспрепятственно работает как с IPv4, так и с IPv6. Возвращает сокет, готовый к отправке или приему данных. Исходный код Редактировать
proc fromSockAddr(sa: Sockaddr_storage | SockAddr | Sockaddr_in | Sockaddr_in6;
                  sl: SockLen; address: var IpAddress; port: var Port) {.inline.}
Преобразует SockAddr и SockLen в IpAddress и Port. Вызывает ObjectConversionDefect в случае неверных аргументов sa и sl. Исходный код Редактировать
proc getExtraData(ctx: SslContext; index: int): RootRef {....raises: [SslError],
    tags: [], forbids: [].}
Получает произвольные данные, хранящиеся внутри SslContext. Исходный код Редактировать
proc getFd(socket: Socket): SocketHandle {....raises: [], tags: [], forbids: [].}
Возвращает дескриптор файла сокета Исходный код Редактировать
proc getLocalAddr(socket: Socket): (string, Port) {.
    ...raises: [OSError, Exception], tags: [], forbids: [].}

Получение локального адреса и номера порта сокета.

Это интерфейс высокого уровня для getsockname.

Исходный код Редактировать
proc getPeerAddr(socket: Socket): (string, Port) {....raises: [OSError, Exception],
    tags: [], forbids: [].}

Получение адреса и номера порта удаленного узла сокета.

Это интерфейс высокого уровня для getpeername.

Исходный код Редактировать
proc getPeerCertificates(socket: Socket): seq[Certificate] {.
    ...raises: [Exception], tags: [], forbids: [].}
Возвращает цепочку сертификатов, полученных от партнера, к которому мы подключены через указанный сокет. Рукопожатие должно быть завершено, а цепочка сертификатов успешно проверена, иначе возвращается пустая последовательность. Цепочка упорядочена от сертификата листа к корневому сертификату. Исходный код Редактировать
proc getPeerCertificates(sslHandle: SslPtr): seq[Certificate] {.
    ...raises: [Exception], tags: [], forbids: [].}
Возвращает цепочку сертификатов, полученных от партнера, к которому мы подключены через OpenSSL-соединение, представленное sslHandle. Рукопожатие должно быть завершено, а цепочка сертификатов успешно проверена, иначе возвращается пустая последовательность. Цепочка упорядочена от сертификата листа к корневому сертификату. Исходный код Редактировать
proc getPrimaryIPAddr(dest = parseIpAddress("8.8.8.8")): IpAddress {.
    ...raises: [OSError, OSError, SslError, ValueError, Exception, LibraryError],
    tags: [ReadIOEffect, RootEffect], forbids: [].}

Находит локальный IP-адрес, обычно назначенный eth0 в локальной сети или wlan0 в Wi-Fi, используемый для доступа к внешнему адресу. Полезно для запуска локальных служб.

Нет трафика отправляется.

Поддерживает IPv4 и IPv6. Вызывает OSError, если внешняя сеть не настроена.

Пример: cmd: -r:off

echo getPrimaryIPAddr() # "192.168.1.2"
Исходный код Изменить
proc getPskIdentity(socket: Socket): string {....raises: [], tags: [], forbids: [].}
Получает идентификатор PSK, предоставленный клиентом. Исходный код Изменить
proc getSocketError(socket: Socket): OSErrorCode {....raises: [OSError], tags: [],
    forbids: [].}
Проверяет osLastError на наличие корректной ошибки. Если она сброшена, используется последняя ошибка, сохранённая в объекте сокета. Исходный код Изменить
proc getSockOpt(socket: Socket; opt: SOBool; level = SOL_SOCKET): bool {.
    ...tags: [ReadIOEffect], raises: [OSError], forbids: [].}
Извлекает опцию opt в виде булевого значения. Исходный код Изменить
proc gotHandshake(socket: Socket): bool {....raises: [SslError], tags: [],
    forbids: [].}

Определяет, произошел ли рукопожатие между клиентом (socket) и сервером, к которому socket подключен.

Выбрасывает SslError, если socket не является SSL-соктом.

Исходный код Изменить
proc hasDataBuffered(s: Socket): bool {....raises: [], tags: [], forbids: [].}
Определяет, есть ли буферизированные данные в сокете. Исходный код Изменить
proc IPv4_any(): IpAddress {....raises: [], tags: [], forbids: [].}
Возвращает IPv4-адрес any, который можно использовать для прослушивания на всех доступных сетевых адаптерах Исходный код Изменить
proc IPv4_broadcast(): IpAddress {....raises: [], tags: [], forbids: [].}
Возвращает IPv4-адрес широковещательной рассылки (255.255.255.255) Исходный код Изменить
proc IPv4_loopback(): IpAddress {....raises: [], tags: [], forbids: [].}
Возвращает IPv4-адрес обратной связи (127.0.0.1) Исходный код Изменить
proc IPv6_any(): IpAddress {....raises: [], tags: [], forbids: [].}
Возвращает IPv6-адрес any (::0), который можно использовать для прослушивания на всех доступных сетевых адаптерах Исходный код Изменить
proc IPv6_loopback(): IpAddress {....raises: [], tags: [], forbids: [].}
Возвращает IPv6-адрес обратной связи (::1) Исходный код Изменить
proc isDisconnectionError(flags: set[SocketFlag]; lastError: OSErrorCode): bool {.
    ...raises: [], tags: [], forbids: [].}
Определяет, является ли lastError ошибкой отключения. Выполняется только в том случае, если флаги содержат SafeDisconn. Исходный код Изменить
proc isIpAddress(addressStr: string): bool {....tags: [], raises: [], forbids: [].}
Проверяет, является ли строка IP-адресом. Возвращает true, если это так, иначе false Исходный код Изменить
proc isSsl(socket: Socket): bool {....raises: [], tags: [], forbids: [].}
Определяет, является ли socket SSL-соктом. Исходный код Изменить
proc listen(socket: Socket; backlog = SOMAXCONN) {....tags: [ReadIOEffect],
    raises: [OSError], forbids: [].}

Помечает socket как принимающий подключения. Backlog задает максимальную длину очереди ожидающих подключений.

При ошибке вызывает ошибку OSError.

Исходный код Изменить
proc newContext(protVersion = protSSLv23; verifyMode = CVerifyPeer;
                certFile = ""; keyFile = ""; cipherList = CiphersIntermediate;
                caDir = ""; caFile = ""; ciphersuites = CiphersModern): SslContext {.
    ...raises: [LibraryError, SslError, Exception, IOError, OSError],
    tags: [RootEffect, ReadDirEffect, ReadEnvEffect, ReadIOEffect], forbids: [].}

Создает SSL-контекст.

Версия протокола в настоящее время игнорируется по умолчанию, используется TLS. С -d:openssl10, могут использоваться только SSLv23 и TLSv1.

Существует три варианта для режима проверки: CVerifyNone: сертификаты не проверяются; CVerifyPeer: сертификаты проверяются; CVerifyPeerUseEnvVars: сертификаты проверяются, и также используются дополнительные переменные окружения SSL_CERT_FILE и SSL_CERT_DIR для поиска сертификатов.

nimDisableCertificateValidation определяют переопределения verifyMode и отключают проверку сертификатов глобально!

Сертификаты CA будут загружены в следующем порядке:

  • caFile, caDir, параметры, если заданы
  • если verifyMode установлено на CVerifyPeerUseEnvVars, используются переменные окружения SSL_CERT_FILE и SSL_CERT_DIR
  • набор файлов и каталогов из файла ssl_certs.

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

Сертификаты можно сгенерировать с помощью следующей команды:

  • openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout mykey.pem -out mycert.pem

или с использованием ECDSA:

  • openssl ecparam -out mykey.pem -name secp256k1 -genkey
  • openssl req -new -key mykey.pem -x509 -nodes -days 365 -out mycert.pem
Исходный код Изменить
proc newSocket(domain, sockType, protocol: cint; buffered = true;
               inheritable = defined(nimInheritHandles)): owned(Socket) {.
    ...raises: [OSError], tags: [], forbids: [].}

Создает новый сокет.

Обработчик сокета, связанный с полученным сокетом, по умолчанию не будет наследуем дочерними процессами. Это можно изменить с помощью параметра inheritable.

При возникновении ошибки будет вызвано исключение OSError.

Исходный код Изменить
proc newSocket(domain: Domain = AF_INET; sockType: SockType = SOCK_STREAM;
               protocol: Protocol = IPPROTO_TCP; buffered = true;
               inheritable = defined(nimInheritHandles)): owned(Socket) {.
    ...raises: [OSError], tags: [], forbids: [].}

Создает новый сокет.

Обработчик сокета, связанный с полученным сокетом, по умолчанию не будет наследуем дочерними процессами. Это можно изменить с помощью параметра inheritable.

При возникновении ошибки будет вызвано исключение OSError.

Исходный код Изменить
proc newSocket(fd: SocketHandle; domain: Domain = AF_INET;
               sockType: SockType = SOCK_STREAM;
               protocol: Protocol = IPPROTO_TCP; buffered = true): owned(Socket) {.
    ...raises: [], tags: [], forbids: [].}
Создает новый сокет, как указано в параметрах. Исходный код Изменить
proc parseIpAddress(addressStr: string): IpAddress {....raises: [ValueError],
    tags: [], forbids: [].}

Разбирает IP-адрес

При ошибке вызывает ValueError.

Для IPv4-адресов только строгий формат, как определено в RFC 6943, считается допустимым, см. https://datatracker.ietf.org/doc/html/rfc6943#section-3.1.1.

Исходный код Изменить
proc pskIdentityHint=(ctx: SslContext; hint: string) {....raises: [SslError],
    tags: [], forbids: [].}

Устанавливает подсказку идентичности, передаваемую серверу.

Используется только в PSK-шифровальных наборах.

Исходный код Изменить
proc raiseSSLError(s = "") {....raises: [SslError], tags: [], forbids: [].}
Вызывает новую ошибку SSL. Исходный код Изменить
proc readLine(socket: Socket; line: var string; timeout = -1;
              flags = {SafeDisconn}; maxLength = MaxLineLength) {.
    ...tags: [ReadIOEffect, TimeEffect], raises: [TimeoutError, OSError, SslError],
    forbids: [].}

Считывает строку данных из socket.

Если полностью считывается строка, \r\L не добавляется в line, однако, если считывается только \r\L, то line будет установлено в это значение.

Если сокет отключён, line будет установлено в "".

Исключение OSError будет возбуждено в случае ошибки сокета.

Таймаут может быть задан в миллисекундах; если данные не получены в течение заданного времени, будет возбуждено исключение TimeoutError.

Параметр maxLength определяет максимальное количество символов, которые могут быть прочитаны. Результат усекается после этого.

Предупреждение: В настоящее время поддерживается только флаг SafeDisconn.
Источник Изменить
proc recv(socket: Socket; data: pointer; size: int): int {....tags: [ReadIOEffect],
    raises: [], forbids: [].}

Получает данные из сокета.

Примечание: Это функция низкого уровня; вас могут заинтересовать функции более высокого уровня с тем же названием recv.

Источник Изменить
proc recv(socket: Socket; data: pointer; size: int; timeout: int): int {.
    ...tags: [ReadIOEffect, TimeEffect], raises: [TimeoutError, OSError],
    forbids: [].}
Перегрузка с параметром timeout в миллисекундах. Источник Изменить
proc recv(socket: Socket; data: var string; size: int; timeout = -1;
          flags = {SafeDisconn}): int {....raises: [TimeoutError, OSError, SslError],
                                        tags: [ReadIOEffect, TimeEffect],
                                        forbids: [].}

Функция более высокого уровня для recv.

Считывает до size байт из socket в data.

Для буферизованных сокетов эта функция попытается прочитать все запрошенные данные. Она будет считывать эти данные частями по BufferSize.

Для небуферизованных сокетов эта функция не пытается прочитать все запрошенные данные. Она вернёт столько данных, сколько предоставит операционная система.

При возвращении 0 соединение сокета было закрыто.

Эта функция возбудит исключение OSError при возникновении ошибки. Значение меньше 0 никогда не возвращается.

Таймаут может быть задан в миллисекундах; если в течение заданного времени не будет получено достаточно данных, будет возбуждено исключение TimeoutError.

Предупреждение: В настоящее время поддерживается только флаг SafeDisconn.
Источник Изменить
proc recv(socket: Socket; size: int; timeout = -1; flags = {SafeDisconn}): string {.
    inline, ...raises: [TimeoutError, OSError, SslError],
    tags: [ReadIOEffect, TimeEffect], forbids: [].}

Функция более высокого уровня для recv, которая возвращает строку.

Считывает до size байт из socket в результат.

Для буферизованных сокетов эта функция попытается прочитать все запрошенные данные. Она будет считывать эти данные частями по BufferSize.

Для небуферизованных сокетов эта функция не пытается прочитать все запрошенные данные. Она вернёт столько данных, сколько предоставит операционная система.

Если возвращается "", соединение сокета было закрыто.

Эта функция возбудит исключение OSError при возникновении ошибки.

Таймаут может быть задан в миллисекундах; если в течение заданного времени не будет получено достаточно данных, будет возбуждено исключение TimeoutError.

Предупреждение: В настоящее время поддерживается только флаг SafeDisconn.
Источник Изменить
proc recvFrom[T: string | IpAddress](socket: Socket; data: var string;
                                     length: int; address: var T;
                                     port: var Port; flags = 0'i32): int {.
    ...tags: [ReadIOEffect].}

Получает данные из socket. Эта функция обычно используется с бессокетными сокетами (UDP-сокетами). Адрес источника пакета данных хранится в аргументе address в виде строки или объекта IpAddress.

Если произошла ошибка, будет возбуждено исключение OSError. В противном случае возвращается длина полученных данных.

Предупреждение: Эта функция ещё не имеет буферизованной реализации, поэтому, когда socket буферизован, используется небуферизованная реализация. Поэтому, если socket содержит данные в своём буфере, эта функция не попытается вернуть их.
Источник Изменить
proc recvLine(socket: Socket; timeout = -1; flags = {SafeDisconn};
              maxLength = MaxLineLength): string {.
    ...raises: [TimeoutError, OSError, SslError], tags: [ReadIOEffect, TimeEffect],
    forbids: [].}

Считывает строку данных из socket.

Если полностью считывается строка, \r\L не добавляется в результат, однако, если считывается только \r\L, то результат будет установлен в это значение.

Если сокет отключён, результат будет установлен в "".

Исключение OSError будет возбуждено в случае ошибки сокета.

Таймаут может быть задан в миллисекундах; если данные не получены в течение заданного времени, будет возбуждено исключение TimeoutError.

Параметр maxLength определяет максимальное количество символов, которые могут быть прочитаны. Результат усекается после этого.

Предупреждение: В настоящее время поддерживается только флаг SafeDisconn.
Источник Изменить
proc send(socket: Socket; data: pointer; size: int): int {.
    ...tags: [WriteIOEffect], raises: [], forbids: [].}

Отправляет данные в сокет.

Примечание: Это функция низкого уровня для send. Вероятно, вам следует использовать функцию ниже.

Источник Изменить
proc send(socket: Socket; data: string; flags = {SafeDisconn}; maxRetries = 100) {.
    ...tags: [WriteIOEffect], raises: [SslError, OSError], forbids: [].}
Отправляет данные в сокет. Попытается отправить все данные, обрабатывая прерывания и неполные записи до maxRetries Источник Изменить
proc sendTo(socket: Socket; address: IpAddress; port: Port; data: string;
            flags = 0'i32): int {.discardable, ...tags: [WriteIOEffect],
                                  raises: [OSError], forbids: [].}

Эта процедура отправляет data на указанный IpAddress и возвращает количество отправленных байт.

Обычно используется с бессокетными (UDP) сокетами.

Если произошла ошибка, будет возбуждено исключение OSError.

Это функция более высокого уровня для функции sendTo выше.

Источник Изменить
proc sendTo(socket: Socket; address: string; port: Port; data: pointer;
            size: int; af: Domain = AF_INET; flags = 0'i32) {.
    ...tags: [WriteIOEffect], raises: [OSError], forbids: [].}

Эта процедура отправляет data на указанный address, который может быть IP-адресом или именем хоста; если указано имя хоста, функция будет перебирать каждый IP-адрес этого хоста. Эта функция обычно используется с бессокетными сокетами (UDP-сокетами).

Если произошла ошибка, будет возбуждено исключение OSError.

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

Примечание: Эта процедура недоступна для SSL-сокетов.

Источник Изменить
proc sendTo(socket: Socket; address: string; port: Port; data: string) {.
    ...tags: [WriteIOEffect], raises: [OSError], forbids: [].}

Эта процедура отправляет data на указанный address, который может быть IP-адресом или именем хоста; если указано имя хоста, функция будет перебирать каждый IP-адрес этого хоста.

Обычно используется с бессокетными (UDP) сокетами.

Если произошла ошибка, будет возбуждено исключение OSError.

Это функция более высокого уровня для функции sendTo выше.

Источник Изменить
proc serverGetPskFunc(ctx: SslContext): SslServerGetPskFunc {....raises: [],
    tags: [], forbids: [].}
Источник Изменить
proc serverGetPskFunc=(ctx: SslContext; fun: SslServerGetPskFunc) {....raises: [],
    tags: [], forbids: [].}

Устанавливает функцию, возвращающую PSK на основе идентификатора клиента.

Используется только в криптографических пакетах PSK.

Источник Изменить
proc sessionIdContext=(ctx: SslContext; sidCtx: string) {....raises: [SslError],
    tags: [], forbids: [].}

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

Клиенты TLS могут попытаться возобновить сеанс, используя контекст идентификатора сеанса, поэтому он должен быть установлен, если verifyMode установлен в CVerifyPeer или CVerifyPeerUseEnvVars, в противном случае подключение завершится ошибкой, и будет вызвано исключение SslError, если возобновление произойдёт.

  • Полезно только при установке на стороне сервера.
  • Должен быть уникальным для каждой приложения, чтобы предотвратить сбои клиентов.
  • sidCtx должен иметь длину не более 32 символов.
Исходный код Редактировать
proc setExtraData(ctx: SslContext; index: int; data: RootRef) {.
    ...raises: [SslError], tags: [], forbids: [].}
Хранит произвольные данные внутри SslContext. Уникальный index должен быть получен с помощью getSslContextExtraDataIndex. Исходный код Редактировать
proc setSockOpt(socket: Socket; opt: SOBool; value: bool; level = SOL_SOCKET) {.
    ...tags: [WriteIOEffect], raises: [OSError], forbids: [].}
Устанавливает параметр opt в логическое значение, заданное value.

Пример: cmd: -r:off

let socket = newSocket()
socket.setSockOpt(OptReusePort, true)
socket.setSockOpt(OptNoDelay, true, level = IPPROTO_TCP.cint)
Исходный код Редактировать
proc skip(socket: Socket; size: int; timeout = -1) {.
    ...raises: [TimeoutError, OSError], tags: [TimeEffect, ReadIOEffect],
    forbids: [].}

Пропускает size количество байтов.

Можно указать необязательный таймаут в миллисекундах. Если пропуск байтов занимает больше времени, чем задано, будет выброшено исключение TimeoutError.

Возвращает количество пропущенных байтов.

Исходный код Редактировать
proc socketError(socket: Socket; err: int = -1; async = false;
                 lastError = -1.OSErrorCode; flags: set[SocketFlag] = {}) {.
    ...gcsafe, raises: [SslError, OSError], tags: [], forbids: [].}
Исходный код Редактировать
proc sslHandle(self: Socket): SslPtr {....raises: [], tags: [], forbids: [].}
Получить указатель ssl для socket. Полезно для взаимодействия с openssl. Исходный код Редактировать
proc toCInt(opt: SOBool): cint {....raises: [], tags: [], forbids: [].}
Преобразует SOBool в его представление Socket Option cint. Исходный код Редактировать
proc toOSFlags(socketFlags: set[SocketFlag]): cint {....raises: [], tags: [],
    forbids: [].}
Преобразует флаги в представление для ОС. Исходный код Редактировать
proc toSockAddr(address: IpAddress; port: Port; sa: var Sockaddr_storage;
                sl: var SockLen) {....raises: [], tags: [], forbids: [].}
Преобразует IpAddress и Port в SockAddr и SockLen Исходный код Редактировать
proc trySend(socket: Socket; data: string): bool {....tags: [WriteIOEffect],
    raises: [], forbids: [].}
Безопасная альтернатива send. Не генерирует исключение OSError при возникновении ошибки, а вместо этого возвращает false при ошибке. Исходный код Редактировать
proc wrapConnectedSocket(ctx: SslContext; socket: Socket;
                         handshake: SslHandshakeType; hostname: string = "") {.
    ...raises: [SslError, Exception], tags: [RootEffect], forbids: [].}

Оборачивает подключенное сокет в контексте SSL. Эта функция эффективно преобразует socket в SSL-сокет. hostname должен быть указан, чтобы клиент знал, с каким именем хоста сервер должен проверять сертификат.

Должен вызываться для подключенного сокета и немедленно выполнит рукопожатие SSL.

FIXME: Предупреждение: этот код не протестирован, может быть очень небезопасным и подвержен уязвимостям.

Исходный код Редактировать
proc wrapSocket(ctx: SslContext; socket: Socket) {....raises: [SslError], tags: [],
    forbids: [].}

Оборачивает сокет в контексте SSL. Эта функция эффективно преобразует socket в SSL-сокет.

Должен вызываться для неподключённого сокета; сеанс SSL будет начат при подключении сокета.

FIXME: Предупреждение: этот код не протестирован, может быть очень небезопасным и подвержен уязвимостям.

Исходный код Редактировать

Шаблоны

template `&=`(socket: Socket; data: typed)
псевдоним для 'send'. Исходный код Редактировать

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/net.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API