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 байтов. Исходный код Изменить
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