Slide 58 de 74

TCP e nomes

proc handle(conn: hive.net.SocketConnection): void {
	if hive.net.socketReceiveLine(conn) is Result.Ok(line) {
		hive.net.socketSend(conn, "você disse: {line}\n")
	}
	hive.net.socketClose(conn)
}

proc main(): void {
	hive.net.socketServe(9000, handle)
}

TCP puro é um fluxo, não uma fila de mensagens, então estas chamadas movem bytes e não mensagens inteiras:

  • socketServe(port, handler) chama um proc(SocketConnection): void uma vez por conexão; socketConnect(host, port) conecta para fora, respondendo com um Result.
  • socketReceive(conn, bytes) responde com até essa quantidade de bytes — menos é normal, não um erro. socketReceiveLine(conn) lê até a próxima quebra de linha e a descarta, um \r antes dela também, e ainda entrega uma última linha que não tenha nenhuma.
  • socketSend(conn, data) responde com os bytes enviados; socketPeer(conn) é quem está do outro lado, como "host:porta"; socketClose(conn) encerra o fluxo.

O reason de um hive.net.SocketError é "Connect", "Closed", "Send" ou "Receive".

Duas chamadas tratam de nomes e não de conexões. resolve(name) busca todo endereço por trás de um nome de host — um nome, não "host:porta" — e um endereço escrito por extenso resolve para si mesmo. localAddress() é o endereço pelo qual outra máquina alcançaria esta, nunca o loopback, descoberto sem enviar nada. O reason do hive.net.NetError delas é "NotFound", "Lookup" ou "NoAddress".