nativesockets
Этот модуль реализует кроссплатформенный интерфейс сокетов низкого уровня. Обратитесь к модулю net для версии более высокого уровня.
Импорты
- os, options, since, winlean
Типы
Port = distinct uint16
- тип порта Исходный код Редактировать
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- домен, который определяет семейство протоколов созданного сокета. Другие домены, кроме перечисленных здесь, не поддерживаются. Исходный код Редактировать
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Исходный код Редактировать 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
- информация о службе Исходный код Редактировать
Hostent = object name*: string aliases*: seq[string] addrtype*: Domain length*: int addrList*: seq[string]
- информация о заданном хосте Исходный код Редактировать
Пути
osInvalidSocket = INVALID_SOCKET
- Исходный код Редактировать
Константы
IOCPARM_MASK = 127
- Исходный код Редактировать
IOC_IN = -2147483648
- Исходный код Редактировать
FIONBIO = -2147195266'i32
- Исходный код Редактировать
Процедуры
proc ioctlsocket(s: SocketHandle; cmd: clong; argptr: ptr clong): cint {...}{. stdcall, importc: "ioctlsocket", dynlib: "ws2_32.dll".}- Исходный код Редактировать
proc `==`(a, b: Port): bool {...}{.borrow.}- для портов. Исходный код Редактировать
proc `$`(p: Port): string {...}{.borrow.}- Возвращает номер порта в виде строки Исходный код Редактировать
proc toInt(domain: Domain): cint {...}{.raises: [], tags: [].}- Преобразует перечисление Domain в зависящую от платформы
cint. Исходный код Редактировать proc toKnownDomain(family: cint): Option[Domain] {...}{.raises: [], tags: [].}- Преобразует зависящую от платформы
cintв перечисление Domain или none(), еслиcintнеизвестна. Исходный код Редактировать proc toInt(typ: SockType): cint {...}{.raises: [], tags: [].}- Преобразует перечисление SockType в зависящую от платформы
cint. Исходный код Редактировать proc toInt(p: Protocol): cint {...}{.raises: [], tags: [].}- Преобразует перечисление Protocol в зависящую от платформы
cint. Исходный код Редактировать proc toSockType(protocol: Protocol): SockType {...}{.raises: [], tags: [].}- Исходный код Редактировать
proc getProtoByName(name: string): int {...}{.raises: [OSError], tags: [].}- Возвращает код протокола из базы данных, соответствующий протоколу
name. Исходный код Редактировать proc close(socket: SocketHandle) {...}{.raises: [], tags: [].}- Закрывает сокет. Исходный код Редактировать
proc setInheritable(s: SocketHandle; inheritable: bool): bool {...}{.inline, raises: [], tags: [].}-
Устанавливает, может ли сокет наследовать дочерними процессами. Возвращает
trueпри успехе.Эта функция не реализована на всех платформах, проверьте доступность с помощью
Исходный код Редактироватьdeclared() <system.html#declared,untyped>. proc createNativeSocket(domain: cint; sockType: cint; protocol: cint; inheritable: bool = defined(nimInheritHandles)): SocketHandle {...}{. raises: [], tags: [].}-
Создает новый сокет; возвращает
osInvalidSocketпри ошибке.inheritableопределяет, может ли полученный SocketHandle унаследоваться дочерними процессами.Используйте этот перегруз, если одно из перечислений выше не содержит необходимой информации.
Исходный код Редактировать proc createNativeSocket(domain: Domain = AF_INET; sockType: SockType = SOCK_STREAM; protocol: Protocol = IPPROTO_TCP; inheritable: bool = defined(nimInheritHandles)): SocketHandle {...}{. raises: [], tags: [].}-
Создает новый сокет; возвращает
osInvalidSocketпри ошибке.
Исходный код Редактироватьinheritableопределяет, может ли полученный SocketHandle унаследоваться дочерними процессами. proc bindAddr(socket: SocketHandle; name: ptr SockAddr; namelen: SockLen): cint {...}{. raises: [], tags: [].}- Исходный код Редактировать
proc listen(socket: SocketHandle; backlog = SOMAXCONN): cint {...}{. tags: [ReadIOEffect], raises: [].}- Помечает
socketкак принимающий подключения.Backlogзадает максимальную длину очереди ожидающих подключений. Исходный код Редактировать proc getAddrInfo(address: string; port: Port; domain: Domain = AF_INET; sockType: SockType = SOCK_STREAM; protocol: Protocol = IPPROTO_TCP): ptr AddrInfo {...}{. raises: [OSError], tags: [].}-
Исходный код РедактироватьПредупреждение: Полученный
ptr AddrInfoдолжен быть освобожден с помощьюfreeAddrInfo! proc ntohl(x: uint32): uint32 {...}{.raises: [], tags: [].}- Преобразует 32-битные беззнаковые целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это бесполезная операция; в противном случае выполняется операция перестановки 4 байт. Исходный код Редактировать
proc ntohs(x: uint16): uint16 {...}{.raises: [], tags: [].}- Преобразует 16-битные беззнаковые целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это бесполезная операция; в противном случае выполняется операция перестановки 2 байт. Исходный код Редактировать
proc getServByName(name, proto: string): Servent {...}{.tags: [ReadIOEffect], raises: [OSError].}-
Ищет в базе данных с начала и находит первую запись, для которой имя службы, указанное
name, совпадает с членом s_name, а имя протокола, указанноеproto, совпадает с членом s_proto.В POSIX это будет поиск в файле
Исходный код Редактировать/etc/services. proc getServByPort(port: Port; proto: string): Servent {...}{.tags: [ReadIOEffect], raises: [OSError].}-
Ищет в базе данных с начала и находит первую запись, для которой порт, указанный
port, совпадает с членом s_port, а имя протокола, указанноеproto, совпадает с членом s_proto.В POSIX это будет поиск в файле
Исходный код Редактировать/etc/services. proc getHostByAddr(ip: string): Hostent {...}{.tags: [ReadIOEffect], raises: [OSError].}- Эта функция ищет имя хоста по IP-адресу. Исходный код Редактировать
proc getHostByName(name: string): Hostent {...}{.tags: [ReadIOEffect], raises: [OSError].}- Эта функция ищет IP-адрес по имени хоста. Исходный код Редактировать
proc getHostname(): string {...}{.tags: [ReadIOEffect], raises: [OSError].}- Возвращает локальное имя хоста (не FQDN) Исходный код Редактировать
proc getSockDomain(socket: SocketHandle): Domain {...}{.raises: [OSError, IOError], tags: [].}- Возвращает домен сокета (AF_INET или AF_INET6). Исходный код Редактировать
proc getAddrString(sockAddr: ptr SockAddr): string {...}{. raises: [Exception, OSError, IOError], tags: [].}- Возвращает строковое представление адреса в пределах sockAddr Исходный код Редактировать
proc getAddrString(sockAddr: ptr SockAddr; strAddress: var string) {...}{. raises: [Exception, OSError, IOError], tags: [].}-
Хранит в
strAddressстроковое представление адреса внутриsockAddrПримечание
-
strAddressдолжен быть инициализирован длиной 46.
-
proc getSockName(socket: SocketHandle): Port {...}{.raises: [OSError], tags: [].}- Возвращает связанный номер порта сокета. Исходный код Редактировать
proc getLocalAddr(socket: SocketHandle; domain: Domain): (string, Port) {...}{. raises: [OSError, Exception], tags: [].}-
Возвращает локальный адрес и номер порта сокета.
Аналогично POSIX's getsockname.
Исходный код Редактировать proc getPeerAddr(socket: SocketHandle; domain: Domain): (string, Port) {...}{. raises: [OSError, Exception], tags: [].}-
Возвращает адрес и номер порта сокета удаленного узла.
Аналогично POSIX's getpeername
Исходный код Редактировать proc getSockOptInt(socket: SocketHandle; level, optname: int): int {...}{. tags: [ReadIOEffect], raises: [OSError].}- getsockopt для целочисленных опций. Исходный код Редактировать
proc setSockOptInt(socket: SocketHandle; level, optname, optval: int) {...}{. tags: [WriteIOEffect], raises: [OSError].}- setsockopt для целочисленных опций. Исходный код Редактировать
proc setBlocking(s: SocketHandle; blocking: bool) {...}{.raises: [OSError], tags: [].}-
Устанавливает режим блокировки для сокета.
При ошибке генерирует исключение OSError.
Исходный код Редактировать proc selectRead(readfds: var seq[SocketHandle]; timeout = 500): int {...}{. raises: [], tags: [].}-
Когда сокет в
readfdsготов к чтению, возвращается ненулевое значение, указывающее количество сокетов, которые можно читать. Сокеты, которые нельзя прочитать, также будут удалены изreadfds.
Исходный код Редактироватьtimeoutзадаётся в миллисекундах, а-1может быть задано для неограниченного времени. proc selectWrite(writefds: var seq[SocketHandle]; timeout = 500): int {...}{. tags: [ReadIOEffect], raises: [].}-
Принимает новое подключение клиента.
writefdsопределяет, может ли полученный SocketHandle унаследоваться дочерними процессами.Возвращает (osInvalidSocket, "") при возникновении ошибки.
Исходный код Редактировать
Шаблоны
template htonl(x: uint32): untyped
- Преобразует 32-битные беззнаковые целые числа из порядка байтов процессора в сетевой порядок байтов. На машинах, где порядок байтов процессора совпадает с сетевым порядком, это нетранзакционная операция; в противном случае выполняется операция перестановки 4 байтов. Исходный код Редактировать
template htons(x: uint16): untyped
- Преобразует 16-битные беззнаковые целые числа из порядка байтов процессора в сетевой порядок байтов. На машинах, где порядок байтов процессора совпадает с сетевым порядком, это нетранзакционная операция; в противном случае выполняется операция перестановки 2 байтов. Исходный код Редактировать
Экспорт
- WSAEWOULDBLOCK, WSAECONNRESET, WSAECONNABORTED, WSAENETRESET, WSANOTINITIALISED, WSAENOTSOCK, WSAEINPROGRESS, WSAEINTR, WSAEDISCON, ERROR_NETNAME_DELETED, SocketHandle, Sockaddr_in, AddrInfo, INADDR_ANY, SockAddr, SockLen, Sockaddr_in6, Sockaddr_storage, inet_ntoa, recv, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, ==, connect, send, accept, recvfrom, sendto, freeaddrinfo, SO_ERROR, SOL_SOCKET, SOMAXCONN, SO_ACCEPTCONN, SO_BROADCAST, SO_DEBUG, SO_DONTROUTE, SO_KEEPALIVE, SO_OOBINLINE, SO_REUSEADDR, SO_REUSEPORT, MSG_PEEK
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/nativesockets.html