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
Типы
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
Константы
Процедуры
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: [].}- Определяет, является ли
socketSSL-соктом. Исходный код Изменить 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 -genkeyopenssl 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 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 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