Spec-Zone.ru › Nim 1

net

Этот модуль реализует кроссплатформенный интерфейс сокетов высокого уровня. Процедуры, реализованные в этом модуле, в основном предназначены для блокирующих сокетов. Для асинхронных неблокирующих сокетов используйте модуль 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 используйте пример ниже.

var socket = newSocket()
socket.connect("google.com", Port(80))

Для SSL используйте следующий пример (и убедитесь, что вы скомпилировали с -d:ssl):

var socket = newSocket()
var ctx = newContext()
wrapSocket(ctx, socket)
socket.connect("google.com", Port(443))

UDP — это протокол без установления соединения, поэтому UDP-сокеты не должны явно вызывать процедуру connect. Они могут просто начать отправлять данные немедленно.

var socket = newSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
socket.sendTo("192.168.0.1", Port(27960), "status\n")

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

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

var socket = newSocket()
socket.bindAddr(Port(1234))
socket.listen()

Затем вы можете начать принимать подключения, используя процедуру accept.

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_certs, ssl_config, winlean, openssl, posix, posix

Типы

Certificate = string
DER-закодированный сертификат Источник Редактировать
SslError = object of CatchableError
Источник Редактировать
SslCVerifyMode = enum
  CVerifyNone, CVerifyPeer, CVerifyPeerUseEnvVars
Источник Редактировать
SslProtVersion = enum
  protSSLv2, protSSLv3, protTLSv1, protSSLv23
Источник Редактировать
SslContext = ref object
  context*: SslCtx
  referencedData: HashSet[int]
  extraInternal: SslContextExtraInternal
Источник Редактировать
SslAcceptResult = enum
  AcceptNoClient = 0, AcceptNoHandshake, AcceptSuccess
Источник Редактировать
SslHandshakeType = enum
  handshakeAsClient, handshakeAsServer
Источник Редактировать
SslClientGetPskFunc = proc (hint: string): tuple[identity: string, psk: string]
Источник Редактировать
SslServerGetPskFunc = proc (identity: string): string
Источник Редактировать
SocketImpl = object
  fd: SocketHandle
  isBuffered: bool
  buffer: array[0 .. BufferSize, char]
  currPos: int
  bufLen: int
  when defineSsl:
      isSsl: bool
      sslHandle: SslPtr
      sslContext: SslContext
      sslNoHandshake: bool
      sslHasPeekChar: bool
      sslPeekChar: char
      sslNoShutdown: bool

  lastError: OSErrorCode     ## stores the last error on this socket
  domain: Domain
  sockType: SockType
  protocol: Protocol
тип сокета Источник Редактировать
Socket = ref SocketImpl
Источник Редактировать
SOBool = enum
  OptAcceptConn, OptBroadcast, OptDebug, OptDontRoute, OptKeepAlive,
  OptOOBInline, OptReuseAddr, OptReusePort, OptNoDelay
Логические параметры сокета. Источник Редактировать
ReadLineResult = enum
  ReadFullLine, ReadPartialLine, ReadDisconnected, ReadNone
результат для readLineAsync Источник Редактировать
TimeoutError = object of CatchableError
Источник Редактировать
SocketFlag {...}{.pure.} = enum
  Peek, SafeDisconn          ## Ensures disconnection exceptions (ECONNRESET, EPIPE etc) are not thrown.
Источник Редактировать
IpAddressFamily {...}{.pure.} = enum
  IPv6,                     ## IPv6 address
  IPv4                       ## IPv4 address
Описывает тип IP-адреса Источник Редактировать
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-адрес Источник Редактировать

Константы

BufferSize: int = 4000
размер буфера буферизованного сокета Источник Редактировать
MaxLineLength = 1000000
Источник Редактировать

Процедуры

proc isDisconnectionError(flags: set[SocketFlag]; lastError: OSErrorCode): bool {...}{.
    raises: [], tags: [].}
Определяет, является ли lastError ошибкой отключения. Делает это только если flags содержит SafeDisconn. Исходный код Редактировать
proc toOSFlags(socketFlags: set[SocketFlag]): cint {...}{.raises: [], tags: [].}
Преобразует флаги в представление операционной системы. Исходный код Редактировать
proc newSocket(fd: SocketHandle; domain: Domain = AF_INET;
               sockType: SockType = SOCK_STREAM;
               protocol: Protocol = IPPROTO_TCP; buffered = true): owned(Socket) {...}{.
    raises: [], tags: [].}
Создаёт новый сокет, как указано в параметрах. Исходный код Редактировать
proc newSocket(domain, sockType, protocol: cint; buffered = true;
               inheritable = defined(nimInheritHandles)): owned(Socket) {...}{.
    raises: [OSError], tags: [].}

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

Обработчик сокета (SocketHandle), связанный с созданным сокетом (Socket), по умолчанию не будет наследуемым дочерними процессами. Это можно изменить с помощью параметра 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: [].}

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

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

В случае ошибки будет поднято исключение OSError.

Исходный код Редактировать
proc parseIpAddress(addressStr: string): IpAddress {...}{.raises: [ValueError],
    tags: [].}
Парсит IP-адрес. Поднимает исключение ValueError при ошибке. Исходный код Редактировать
proc isIpAddress(addressStr: string): bool {...}{.tags: [], raises: [].}
Проверяет, является ли строка IP-адресом. Возвращает true, если является, иначе false. Исходный код Редактировать
proc toSockAddr(address: IpAddress; port: Port; sa: var Sockaddr_storage;
                sl: var SockLen) {...}{.raises: [], tags: [].}
Преобразует IpAddress и Port в SockAddr и SockLen. Исходный код Редактировать
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 raiseSSLError(s = "") {...}{.raises: [SslError], tags: [].}
Поднимает новую ошибку SSL. Исходный код Редактировать
proc getExtraData(ctx: SslContext; index: int): RootRef {...}{.raises: [SslError],
    tags: [].}
Извлекает произвольные данные, хранящиеся внутри SslContext. Исходный код Редактировать
proc setExtraData(ctx: SslContext; index: int; data: RootRef) {...}{.
    raises: [SslError], tags: [].}
Хранит произвольные данные внутри SslContext. Уникальный идентификатор index должен быть получен с помощью функции getSslContextExtraDataIndex. Исходный код Редактировать
proc newContext(protVersion = protSSLv23; verifyMode = CVerifyPeer;
                certFile = ""; keyFile = ""; cipherList = CiphersIntermediate;
                caDir = ""; caFile = ""): SslContext {...}{.
    raises: [Exception, LibraryError, SslError, IOError],
    tags: [RootEffect, ReadDirEffect, ReadEnvEffect].}

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

Версия протокола определяет используемый протокол. Доступны SSLv2, SSLv3, TLSv1 с добавлением protSSLv23, что позволяет обеспечить совместимость со всеми ними.

Есть три варианта режима проверки: 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 destroyContext(ctx: SslContext) {...}{.raises: [SslError], tags: [].}
Освобождает память, на которую ссылается SslContext. Исходный код Редактировать
proc pskIdentityHint=(ctx: SslContext; hint: string) {...}{.raises: [SslError],
    tags: [].}

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

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

Исходный код Редактировать
proc clientGetPskFunc(ctx: SslContext): SslClientGetPskFunc {...}{.raises: [],
    tags: [].}
Исходный код Редактировать
proc clientGetPskFunc=(ctx: SslContext; fun: SslClientGetPskFunc) {...}{.
    raises: [Exception], tags: [RootEffect].}

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

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

Исходный код Редактировать
proc serverGetPskFunc(ctx: SslContext): SslServerGetPskFunc {...}{.raises: [],
    tags: [].}
Исходный код Редактировать
proc serverGetPskFunc=(ctx: SslContext; fun: SslServerGetPskFunc) {...}{.
    raises: [Exception], tags: [RootEffect].}

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

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

Исходный код Редактировать
proc getPskIdentity(socket: Socket): string {...}{.raises: [], tags: [].}
Получает идентификатор PSK, предоставленный клиентом. Исходный код Редактировать
proc wrapSocket(ctx: SslContext; socket: Socket) {...}{.raises: [SslError], tags: [].}

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

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

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

Исходный код Редактировать
proc wrapConnectedSocket(ctx: SslContext; socket: Socket;
                         handshake: SslHandshakeType; hostname: string = "") {...}{.
    raises: [SslError, Exception], tags: [RootEffect].}

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

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

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

Исходный код Редактировать
proc getPeerCertificates(sslHandle: SslPtr): seq[Certificate] {...}{.
    raises: [Exception], tags: [].}
Возвращает цепочку сертификатов, полученную от сокета, к которому мы подключены через соединение OpenSSL, представленное sslHandle. Рукопожатие должно быть завершено, а цепочка сертификатов должна быть успешно проверена, в противном случае возвращается пустая последовательность. Цепочка упорядочена от листового сертификата к корневому сертификату. Исходный код Редактировать
proc getPeerCertificates(socket: Socket): seq[Certificate] {...}{.
    raises: [Exception], tags: [].}
Возвращает цепочку сертификатов, полученную от сокета, к которому мы подключены. Рукопожатие должно быть завершено, а цепочка сертификатов должна быть успешно проверена, в противном случае возвращается пустая последовательность. Цепочка упорядочена от листового сертификата к корневому сертификату. Исходный код Редактировать
proc sessionIdContext=(ctx: SslContext; sidCtx: string) {...}{.raises: [SslError],
    tags: [].}

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

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

  • Полезно только если установлено на стороне сервера.
  • Должно быть уникальным для каждой программы, чтобы предотвратить сбои клиентов.
  • sidCtx должен быть не более 32 символов в длину.
Исходный код Редактировать
proc getSocketError(socket: Socket): OSErrorCode {...}{.raises: [OSError], tags: [].}
Проверяет osLastError на наличие корректной ошибки. Если ошибка сброшена, используется последняя ошибка, сохранённая в объекте сокета. Исходный код Редактировать
proc socketError(socket: Socket; err: int = -1; async = false;
                 lastError = -1.OSErrorCode; flags: set[SocketFlag] = {}): void {...}{.
    gcsafe, raises: [SslError, OSError], tags: [].}

Вызывает OSError на основе кода ошибки, возвращённого SSL_get_error (для SSL-сокетов) и osLastError в противном случае.

Если async равно true, исключение не будет выброшено в случае, если ошибка вызвана отсутствием данных для чтения.

Если err не меньше 0, исключение не будет выброшено.

Если flags содержит SafeDisconn, исключение не будет выброшено, если ошибка вызвана разрывом соединения со стороны удалённого узла.

Исходный код Редактировать
proc listen(socket: Socket; backlog = SOMAXCONN) {...}{.tags: [ReadIOEffect],
    raises: [OSError].}

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

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

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

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

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

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

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

Результат работы с клиентом унаследует все свойства серверного сокета. Например: буферизован ли сокет или нет.

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

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

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

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

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

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

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

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

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

Исходный код Редактировать
proc toCInt(opt: SOBool): cint {...}{.raises: [], tags: [].}
Преобразует SOBool в его представление Socket Option cint. Исходный код Редактировать
proc getSockOpt(socket: Socket; opt: SOBool; level = SOL_SOCKET): bool {...}{.
    tags: [ReadIOEffect], raises: [OSError].}
Возвращает опцию opt в виде булевого значения. Исходный код Редактировать
proc getLocalAddr(socket: Socket): (string, Port) {...}{.
    raises: [OSError, Exception], tags: [].}

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

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

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

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

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

Исходный код Редактировать
proc setSockOpt(socket: Socket; opt: SOBool; value: bool; level = SOL_SOCKET) {...}{.
    tags: [WriteIOEffect], raises: [OSError].}
Устанавливает опцию opt в булевое значение, заданное value.
var socket = newSocket()
socket.setSockOpt(OptReusePort, true)
socket.setSockOpt(OptNoDelay, true, level=IPPROTO_TCP.toInt)
Исходный код Редактировать
proc connectUnix(socket: Socket; path: string) {...}{.raises: [], tags: [].}
Подключается к Unix-сокету по адресу path. Это работает только на системах типа Unix: Mac OS X, BSD и Linux Исходный код Редактировать
proc bindUnix(socket: Socket; path: string) {...}{.raises: [], tags: [].}
Привязывает Unix-сокет к path. Это работает только на системах типа Unix: Mac OS X, BSD и Linux Исходный код Редактировать
proc hasDataBuffered(s: Socket): bool {...}{.raises: [], tags: [].}
Определяет, есть ли данные в буфере сокета. Исходный код Редактировать
proc recv(socket: Socket; data: pointer; size: int): int {...}{.tags: [ReadIOEffect],
    raises: [].}

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

Примечание: Это функция низкого уровня, возможно, вас заинтересуют высокоуровневые версии этой функции, которые также называются recv.

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

Высокоуровневая версия recv.

Читает до size байт из socket в buf.

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

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

Возвращение 0 означает закрытие соединения сокета.

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

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

Примечание: data должен быть инициализирован.

Предупреждение: В настоящее время поддерживается только флаг SafeDisconn.

Исходный код Редактировать
proc recv(socket: Socket; size: int; timeout = -1; flags = {SafeDisconn}): string {...}{.
    inline, raises: [TimeoutError, OSError, SslError],
    tags: [ReadIOEffect, TimeEffect].}

Высокоуровневая версия recv, которая возвращает строку.

Читает до size байт из socket в buf.

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

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

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

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

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

Предупреждение: В настоящее время поддерживается только флаг SafeDisconn.

Исходный код Редактировать
proc readLine(socket: Socket; line: var TaintedString; timeout = -1;
              flags = {SafeDisconn}; maxLength = MaxLineLength) {...}{.
    tags: [ReadIOEffect, TimeEffect], raises: [TimeoutError, OSError, SslError].}

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

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

Если сокет прерван, line будет установлено в "".

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

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

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

Предупреждение: В настоящее время поддерживается только флаг SafeDisconn.

Исходный код Редактировать
proc recvLine(socket: Socket; timeout = -1; flags = {SafeDisconn};
              maxLength = MaxLineLength): TaintedString {...}{.
    raises: [TimeoutError, OSError, SslError], tags: [ReadIOEffect, TimeEffect].}

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

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

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

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

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

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

Предупреждение: В настоящее время поддерживается только флаг SafeDisconn.

Исходный код Изменить
proc recvFrom(socket: Socket; data: var string; length: int;
              address: var string; port: var Port; flags = 0'i32): int {...}{.
    tags: [ReadIOEffect], raises: [Exception, OSError, IOError, ValueError].}

Получает данные из socket. Эта функция обычно используется с бессокетными сокетами (UDP-сокетами).

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

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

Исходный код Изменить
proc skip(socket: Socket; size: int; timeout = -1) {...}{.
    raises: [TimeoutError, OSError], tags: [TimeEffect, ReadIOEffect].}

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

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

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

Исходный код Изменить
proc send(socket: Socket; data: pointer; size: int): int {...}{.
    tags: [WriteIOEffect], raises: [].}

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

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

Исходный код Изменить
proc send(socket: Socket; data: string; flags = {SafeDisconn}) {...}{.
    tags: [WriteIOEffect], raises: [SslError, OSError].}
отправляет данные в сокет. Исходный код Изменить
proc trySend(socket: Socket; data: string): bool {...}{.tags: [WriteIOEffect],
    raises: [].}
Безопасная альтернатива send. Не возбуждает OSError при возникновении ошибки, а вместо этого возвращает false при неудаче. Исходный код Изменить
proc sendTo(socket: Socket; address: string; port: Port; data: pointer;
            size: int; af: Domain = AF_INET; flags = 0'i32) {...}{.
    tags: [WriteIOEffect], raises: [OSError].}

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

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

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

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

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

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

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

Это высокоуровневая версия функции sendTo выше.

Исходный код Изменить
proc isSsl(socket: Socket): bool {...}{.raises: [], tags: [].}
Определяет, является ли socket SSL-сокетом. Исходный код Изменить
proc getFd(socket: Socket): SocketHandle {...}{.raises: [], tags: [].}
Возвращает дескриптор файла сокета Исходный код Изменить
proc IPv4_any(): IpAddress {...}{.raises: [], tags: [].}
Возвращает любой IPv4-адрес, который можно использовать для прослушивания на всех доступных сетевых адаптерах Исходный код Изменить
proc IPv4_loopback(): IpAddress {...}{.raises: [], tags: [].}
Возвращает IPv4-адрес обратной связи (127.0.0.1) Исходный код Изменить
proc IPv4_broadcast(): IpAddress {...}{.raises: [], tags: [].}
Возвращает IPv4-адрес широковещательной рассылки (255.255.255.255) Исходный код Изменить
proc IPv6_any(): IpAddress {...}{.raises: [], tags: [].}
Возвращает любой IPv6-адрес (::0), который можно использовать для прослушивания на всех доступных сетевых адаптерах Исходный код Изменить
proc IPv6_loopback(): IpAddress {...}{.raises: [], tags: [].}
Возвращает IPv6-адрес обратной связи (::1) Исходный код Изменить
proc `==`(lhs, rhs: IpAddress): bool {...}{.raises: [], tags: [].}
Сравнивает два IpAddress на равенство. Возвращает true, если адреса равны Исходный код Изменить
proc `$`(address: IpAddress): string {...}{.raises: [], tags: [].}
Преобразует IpAddress в текстовое представление Исходный код Изменить
proc dial(address: string; port: Port; protocol = IPPROTO_TCP; buffered = true): owned(
    Socket) {...}{.tags: [ReadIOEffect, WriteIOEffect], raises: [OSError, IOError].}
Устанавливает соединение с указанной парой address:port через указанный протокол. Процедура перебирает возможные разрешения address до успеха, что означает, что она беспрепятственно работает как с IPv4, так и с IPv6. Возвращает сокет, готовый к отправке или приёму данных. Исходный код Изменить
proc connect(socket: Socket; address: string; port = Port(0)) {...}{.
    tags: [ReadIOEffect], raises: [OSError, SslError].}

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

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

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

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

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

Предупреждение: Эта процедура, похоже, не работает для SSL-соединений начиная с Nim v1.0.2. Рассмотрите использование другой процедуры connect. См. https://github.com/nim-lang/Nim/issues/15215 для получения дополнительной информации.

Исходный код Изменить
proc getPrimaryIPAddr(dest = parseIpAddress("8.8.8.8")): IpAddress {...}{.
    raises: [OSError, OSError, SslError, ValueError, Exception, LibraryError],
    tags: [ReadIOEffect, RootEffect].}

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

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

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

echo $getPrimaryIPAddr()  # "192.168.1.2"
Исходный код Изменить

Шаблоны

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

Экспорт

Порт, $, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, Домен, ТипСокета, Протокол

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

Spec-Zone.ru

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