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