Spec-Zone.ru › Nim

std/nativesockets

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

Этот модуль реализует кроссплатформенный интерфейс сокетов низкого уровня. Обратитесь к модулю net для получения более высокого уровня.

Импорты

os, options, since, strbasics, winlean

Типы

Domain = enum
  AF_UNSPEC = 0, ## unspecified domain (can be detected automatically by
                  ## some procedures, such as getaddrinfo)
  AF_UNIX = 1,              ## for local socket (using a file). Unsupported on Windows.
  AF_INET = 2,              ## for network protocol IPv4 or
  AF_INET6 = 23
домен, который определяет семейство протоколов созданного сокета. Другие домены, не указанные здесь, не поддерживаются. Исходный код Редактировать
Hostent = object
  name*: string
  aliases*: seq[string]
  addrtype*: Domain
  length*: int
  addrList*: seq[string]
информация о данном хосте Исходный код Редактировать
Port = distinct uint16
тип порта Исходный код Редактировать
Protocol = enum
  IPPROTO_TCP = 6,          ## Transmission control protocol.
  IPPROTO_UDP = 17,         ## User datagram protocol.
  IPPROTO_IP,               ## Internet protocol.
  IPPROTO_IPV6,             ## Internet Protocol Version 6.
  IPPROTO_RAW,              ## Raw IP Packets Protocol. Unsupported on Windows.
  IPPROTO_ICMP,             ## Internet Control message protocol.
  IPPROTO_ICMPV6             ## Internet Control message protocol for IPv6.
третий аргумент для процедуры socket Исходный код Редактировать
Servent = object
  name*: string
  aliases*: seq[string]
  port*: Port
  proto*: string
информация о службе Исходный код Редактировать
SockType = enum
  SOCK_STREAM = 1,          ## reliable stream-oriented service or Stream Sockets
  SOCK_DGRAM = 2,           ## datagram service or Datagram Sockets
  SOCK_RAW = 3,             ## raw protocols atop the network layer.
  SOCK_SEQPACKET = 5         ## reliable sequenced packet service
второй аргумент для процедуры socket Исходный код Редактировать

Переменные

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

Константы

FIONBIO = -2147195266'i32
Исходный код Редактировать
IOC_IN = -2147483648
Исходный код Редактировать
IOCPARM_MASK = 127
Исходный код Редактировать
IPPROTO_NONE = IPPROTO_IP
Используйте это, если вашему типу сокета требуется значение протокола ноль (например, сокеты Unix). Исходный код Редактировать

Процедуры

proc `$`(p: Port): string {.borrow, ...raises: [], tags: [], forbids: [].}
Возвращает номер порта в виде строки Исходный код Изменить
proc `==`(a, b: Port): bool {.borrow, ...raises: [], tags: [], forbids: [].}
== для портов. Исходный код Изменить
proc accept(fd: SocketHandle; inheritable = defined(nimInheritHandles)): (
    SocketHandle, string) {....raises: [], tags: [], forbids: [].}

Принимает новое подключение клиента.

inheritable определяет, может ли полученный SocketHandle наследоваться дочерними процессами.

Возвращает (osInvalidSocket, "") в случае ошибки.

Исходный код Изменить
proc bindAddr(socket: SocketHandle; name: ptr SockAddr; namelen: SockLen): cint {.
    ...raises: [], tags: [], forbids: [].}
Исходный код Изменить
proc close(socket: SocketHandle) {....raises: [], tags: [], forbids: [].}
Закрывает сокет. Исходный код Изменить
proc createNativeSocket(domain: cint; sockType: cint; protocol: cint;
                        inheritable: bool = defined(nimInheritHandles)): SocketHandle {.
    ...raises: [], tags: [], forbids: [].}

Создаёт новый сокет; возвращает osInvalidSocket в случае ошибки.

inheritable определяет, может ли полученный SocketHandle наследоваться дочерними процессами.

Используйте этот перегруз, если один из перечисленных выше вариантов не содержит необходимого.

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

Создаёт новый сокет; возвращает osInvalidSocket в случае ошибки.

inheritable определяет, может ли полученный SocketHandle наследоваться дочерними процессами.

Исходный код Изменить
proc getAddrInfo(address: string; port: Port; domain: Domain = AF_INET;
                 sockType: SockType = SOCK_STREAM;
                 protocol: Protocol = IPPROTO_TCP): ptr AddrInfo {.
    ...raises: [OSError], tags: [], forbids: [].}
Предупреждение: Результирующий ptr AddrInfo должен быть освобождён с помощью freeAddrInfo!
Исходный код Изменить
proc getAddrString(sockAddr: ptr SockAddr): string {.
    ...raises: [Exception, OSError, IOError], tags: [], forbids: [].}
Возвращает строковое представление адреса внутри sockAddr Исходный код Изменить
proc getAddrString(sockAddr: ptr SockAddr; strAddress: var string) {.
    ...raises: [Exception, OSError, IOError], tags: [], forbids: [].}

Сохраняет в strAddress строковое представление адреса внутри sockAddr

Примечание

  • strAddress должен быть инициализирован длиной 46.
Исходный код Изменить
proc getHostByAddr(ip: string): Hostent {....tags: [ReadIOEffect],
    raises: [OSError, IOError, Exception], forbids: [].}
Эта функция выполняет поиск имени хоста по IP-адресу. Исходный код Изменить
proc getHostByName(name: string): Hostent {....tags: [ReadIOEffect],
    raises: [OSError], forbids: [].}
Эта функция выполнит поиск IP-адреса по имени хоста. Исходный код Изменить
proc getHostname(): string {....tags: [ReadIOEffect], raises: [OSError],
                             forbids: [].}
Возвращает имя локального хоста (не FQDN) Исходный код Изменить
proc getLocalAddr(socket: SocketHandle; domain: Domain): (string, Port) {.
    ...raises: [OSError, Exception], tags: [], forbids: [].}

Возвращает локальный адрес и номер порта сокета.

Аналогично POSIX getsockname.

Исходный код Изменить
proc getPeerAddr(socket: SocketHandle; domain: Domain): (string, Port) {.
    ...raises: [OSError, Exception], tags: [], forbids: [].}

Возвращает адрес и номер порта сокета.

Аналогично POSIX getpeername

Исходный код Изменить
proc getProtoByName(name: string): int {....raises: [OSError], tags: [],
    forbids: [].}
Возвращает код протокола из базы данных, соответствующий протоколу name. Исходный код Изменить
proc getServByName(name, proto: string): Servent {....tags: [ReadIOEffect],
    raises: [OSError], forbids: [].}

Ищет в базе данных и находит первую запись, для которой имя службы, указанное name, совпадает с членом s_name, и имя протокола, указанное proto, совпадает с членом s_proto.

В POSIX это будет поиск в файле /etc/services.

Исходный код Изменить
proc getServByPort(port: Port; proto: string): Servent {....tags: [ReadIOEffect],
    raises: [OSError], forbids: [].}

Ищет в базе данных и находит первую запись, для которой порт, указанный port, совпадает с членом s_port, и имя протокола, указанное proto, совпадает с членом s_proto.

В POSIX это будет поиск в файле /etc/services.

Исходный код Изменить
proc getSockDomain(socket: SocketHandle): Domain {....raises: [OSError, IOError],
    tags: [], forbids: [].}
Возвращает домен сокета (AF_INET или AF_INET6). Исходный код Изменить
proc getSockName(socket: SocketHandle): Port {....raises: [OSError], tags: [],
    forbids: [].}
Возвращает связанный номер порта сокета. Исходный код Изменить
proc getSockOptInt(socket: SocketHandle; level, optname: int): int {.
    ...tags: [ReadIOEffect], raises: [OSError], forbids: [].}
getsockopt для целочисленных опций. Исходный код Изменить
proc ioctlsocket(s: SocketHandle; cmd: clong; argptr: ptr clong): cint {.
    stdcall, importc: "ioctlsocket", dynlib: "ws2_32.dll", ...raises: [], tags: [],
    forbids: [].}
Исходный код Изменить
proc listen(socket: SocketHandle; backlog = SOMAXCONN): cint {.
    ...tags: [ReadIOEffect], raises: [], forbids: [].}
Помечает socket как принимающий подключения. Backlog задаёт максимальную длину очереди ожидающих подключений. Исходный код Изменить
proc ntohl(x: uint32): uint32 {....raises: [], tags: [], forbids: [].}
Преобразует 32-битные беззнаковые целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это ничто; в противном случае, выполняется операция перестановки 4 байтов. Исходный код Изменить
END_OF_DOCUMENT_MARKER
proc ntohs(x: uint16): uint16 {....raises: [], tags: [], forbids: [].}
Преобразует 16-битные целые беззнаковые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это не имеет эффекта; в противном случае выполняется операция перестановки байтов (2 байта). Исходный код Редактировать
proc selectRead(readfds: var seq[SocketHandle]; timeout = 500): int {.
    ...raises: [], tags: [], forbids: [].}

Когда сокет в readfds готов к чтению, будет возвращено ненулевое значение, указывающее количество сокетов, которые можно прочитать. Сокеты, которые нельзя прочитать, также будут удалены из readfds.

timeout указано в миллисекундах, и -1 может быть указано для неограниченного времени.

Исходный код Редактировать
proc selectWrite(writefds: var seq[SocketHandle]; timeout = 500): int {.
    ...tags: [ReadIOEffect], raises: [], forbids: [].}

Когда сокет в writefds готов к записи, будет возвращено ненулевое значение, указывающее количество сокетов, к которым можно записать. Сокеты, в которые нельзя записать, также будут удалены из writefds.

timeout указано в миллисекундах, и -1 может быть указано для неограниченного времени.

Исходный код Редактировать
proc setBlocking(s: SocketHandle; blocking: bool) {....raises: [OSError], tags: [],
    forbids: [].}

Устанавливает режим блокировки для сокета.

При ошибке генерирует исключение OSError.

Исходный код Редактировать
proc setInheritable(s: SocketHandle; inheritable: bool): bool {.inline,
    ...raises: [], tags: [], forbids: [].}

Устанавливает, наследуется ли сокет дочерними процессами. Возвращает true при успехе.

Эта функция не реализована на всех платформах, проверьте её доступность с помощью declared() <system.html#declared,untyped>.

Исходный код Редактировать
proc setSockOptInt(socket: SocketHandle; level, optname, optval: int) {.
    ...tags: [WriteIOEffect], raises: [OSError], forbids: [].}
setsockopt для целочисленных опций. Исходный код Редактировать
proc toInt(domain: Domain): cint {....raises: [], tags: [], forbids: [].}
Преобразует перечисление Domain в зависящее от платформы cint. Исходный код Редактировать
proc toInt(p: Protocol): cint {....raises: [], tags: [], forbids: [].}
Преобразует перечисление Protocol в зависящее от платформы cint. Исходный код Редактировать
proc toInt(typ: SockType): cint {....raises: [], tags: [], forbids: [].}
Преобразует перечисление SockType в зависящее от платформы cint. Исходный код Редактировать
proc toKnownDomain(family: cint): Option[Domain] {....raises: [], tags: [],
    forbids: [].}
Преобразует зависящее от платформы cint в перечисление Domain или none(), если cint неизвестно. Исходный код Редактировать
proc toSockType(protocol: Protocol): SockType {....raises: [], tags: [],
    forbids: [].}
Исходный код Редактировать

Шаблоны

template htonl(x: uint32): untyped
Преобразует 32-битные целые беззнаковые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это не имеет эффекта; в противном случае выполняется операция перестановки байтов (4 байта). Исходный код Редактировать
template htons(x: uint16): untyped
Преобразует 16-битные целые беззнаковые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это не имеет эффекта; в противном случае выполняется операция перестановки байтов (2 байта). Исходный код Редактировать

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

Spec-Zone.ru

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