std/socketstreams
Source EditЭтот модуль предоставляет реализацию интерфейса потоков для сокетов. Он содержит две отдельные реализации: ReadSocketStream и WriteSocketStream.
ReadSocketStream поддерживает только чтение, предварительный просмотр и позиционирование. Он считывает данные в буфер, поэтому даже при перемещении назад он будет считывать только ту же позицию один раз из основного сокета. Чтобы очистить буфер и освободить считанные данные, можно вызвать resetStream, это также сбросит позицию обратно к 0, но не повлияет на основной сокет.
WriteSocketStream позволяет как чтение, так и запись, но выполняет чтение из внутреннего буфера. Таким образом, записав в буфер, можно прочитать обратно записанное значение, не получая ничего из сокета. Также можно установить позицию и перезаписать части буфера, а для отправки данных через сокет необходимо вызвать flush, после чего нельзя ничего записывать в буфер до момента сброса (но его все еще можно прочитать). Опять же, для очистки внутреннего буфера нужно вызвать resetStream.
Примеры
import std/socketstreams
var
socket = newSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
stream = newReadSocketStream(socket)
socket.sendTo("127.0.0.1", Port(12345), "SOME REQUEST")
echo stream.readLine() # Will call `recv`
stream.setPosition(0)
echo stream.readLine() # Will return the read line from the buffer
stream.resetStream() # Buffer is now empty, position is 0
echo stream.readLine() # Will call `recv` again
stream.close() # Closes the socket
import std/socketstreams
var socket = newSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
socket.connect("127.0.0.1", Port(12345))
var sendStream = newWriteSocketStream(socket)
sendStream.write "NOM"
sendStream.setPosition(1)
echo sendStream.peekStr(2) # OM
sendStream.write "I"
sendStream.setPosition(0)
echo sendStream.readStr(3) # NIM
echo sendStream.getPosition() # 3
sendStream.flush() # This actually performs the writing to the socket
sendStream.setPosition(1)
sendStream.write "I" # Throws an error as we can't write into an already sent buffer Импорты
- net, streams
Типы
Процедуры
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/socketstreams.html