class Socket::Raw
Overview
This class represents a raw network socket.
It is an object oriented wrapper for BSD-style socket API provided by POSIX operating systems and Windows.
This class is not intended to be used for typical network applications. There
are more specific implementations TCPSocket, UDPSocket, UNIXSocket, TCPServer, and UNIXServer.
It allows finer-grained control over socket parameters than the protocol-specific classes
and only needs to be employed for less common tasks that need low-level access to the OS sockets.
Included Modules
Defined in:
socket/raw.crConstructors
-
.new(family : Family, type : Type, protocol : Protocol = Protocol::IP, *, blocking : Bool = false)
Creates a new raw socket.
- .new(fd : Int32, family, type, protocol = Protocol::IP, *, blocking : Bool = false)
Class Method Summary
Instance Method Summary
-
#accept
Accepts an incoming connection.
-
#accept?
Accepts an incoming connection.
-
#bind(addr : Address | Addrinfo, &block)
Tries to bind the socket to a local address.
-
#bind(addr : Address | Addrinfo)
Binds the socket to a local address.
-
#bind(port : Int)
Binds the socket on port to all local interfaces.
-
#bind(host : String, port : Int)
Binds the socket to a local IP socket address specified by host and port.
- #blocking
- #blocking=(value)
- #close_on_exec=(arg : Bool)
- #close_on_exec?
-
#close_read
Calls
shutdown(2)withSHUT_RD -
#close_write
Calls
shutdown(2)withSHUT_WR - #closed? : Bool
-
#connect(address : Address | Addrinfo, *, connect_timeout = nil, &block : IO::Timeout | Errno -> )
Connects the socket to a socket address specified by address.
-
#connect(address : Address | Addrinfo, *, connect_timeout = nil) : Nil
Connects the socket to a socket address specified by address.
-
#connect(host : String, port : Int, *, dns_timeout = nil, connect_timeout = nil)
Connects the socket to a IP socket address specified by host and port.
- #family : Family
- #fcntl(cmd, arg = 0)
-
#fd : Int32
The raw file-descriptor.
- #finalize
-
#getsockopt(optname, optval, level = LibC::SOL_SOCKET)
Returns the modified optval.
- #getsockopt_bool(optname, level = LibC::SOL_SOCKET)
- #inspect(io)
-
#listen(*, backlog : Int32 = SOMAXCONN, &block)
Tries to listen for connections on the previously bound socket.
-
#listen(*, backlog : Int32 = SOMAXCONN)
Tells the previously bound socket to listen for incoming connections.
-
#local_address : Address
Returns the
Addressfor the local end of the socket. - #protocol : Protocol
-
#receive(*, max_message_size = 512) : Tuple(String, Address)
Receives a text message from the previously bound address.
-
#receive(message : Bytes) : Tuple(Int32, Address)
Receives a binary message from the previously bound address.
-
#remote_address : Address
Returns the
Addressfor the remote end of the socket. -
#send(message, *, to addr : Address)
Sends a message to the specified remote address.
-
#send(message)
Sends a message to a previously connected remote address.
-
#setsockopt(optname, optval, level = LibC::SOL_SOCKET)
NOTE optval is restricted to
Int32until sizeof works on variables. - #setsockopt_bool(optname, optval : Bool, level = LibC::SOL_SOCKET)
- #tty?
- #type : Type
Instance methods inherited from module IO::Syscall
read_syscall_helper(slice : Bytes, errno_msg : String, &block) : Int32
read_syscall_helper,
read_timeout : Time::Span?
read_timeout,
read_timeout=(read_timeout : Number) : Numberread_timeout=(timeout : Time::Span?) : Time::Span? read_timeout=, write_syscall_helper(slice : Bytes, errno_msg : String, &block) : Nil write_syscall_helper, write_timeout : Time::Span? write_timeout, write_timeout=(write_timeout : Number) : Number
write_timeout=(timeout : Time::Span?) : Time::Span? write_timeout=
Instance methods inherited from module IO::Buffered
close : Nil
close,
flush
flush,
flush_on_newline=(flush_on_newline)
flush_on_newline=,
flush_on_newline?
flush_on_newline?,
peek : Bytes?
peek,
read(slice : Bytes)
read,
read_buffering=(read_buffering)
read_buffering=,
read_buffering?
read_buffering?,
rewind
rewind,
sync=(sync)
sync=,
sync?
sync?,
unbuffered_close
unbuffered_close,
unbuffered_flush
unbuffered_flush,
unbuffered_read(slice : Bytes)
unbuffered_read,
unbuffered_rewind
unbuffered_rewind,
unbuffered_write(slice : Bytes)
unbuffered_write,
write(slice : Bytes)
write
Instance methods inherited from class IO
<<(obj) : self
<<,
close
close,
closed?
closed?,
each_byte(&block) : Nileach_byte each_byte, each_char(&block) : Nil
each_char each_char, each_line(*args, **options, &block) : Nil
each_line(*args, **options) each_line, encoding : String encoding, flush flush, gets(delimiter : Char, limit : Int, chomp = false) : String?
gets(delimiter : Char, chomp = false) : String?
gets(chomp = true) : String?
gets(limit : Int, chomp = false) : String?
gets(delimiter : String, chomp = false) : String? gets, gets_to_end : String gets_to_end, peek : Bytes? peek, pos pos, pos=(value) pos=, print(*objects : _) : Nil
print(obj) : Nil print, printf(format_string, *args) : Nil
printf(format_string, args : Array | Tuple) : Nil printf, puts(*objects : _) : Nil
puts : Nil
puts(obj) : Nil
puts(string : String) : Nil puts, read(slice : Bytes) read, read_at(offset, bytesize, &block) read_at, read_byte : UInt8? read_byte, read_bytes(type, format : IO::ByteFormat = IO::ByteFormat::SystemEndian) read_bytes, read_char : Char? read_char, read_fully(slice : Bytes) read_fully, read_fully?(slice : Bytes) read_fully?, read_line(*args, **options) : String read_line, read_string(bytesize : Int) : String read_string, read_utf8(slice : Bytes) read_utf8, read_utf8_byte read_utf8_byte, rewind rewind, seek(offset, whence : Seek = Seek::Set) seek, set_encoding(encoding : String, invalid : Symbol? = nil) set_encoding, skip(bytes_count : Int) : Nil skip, skip_to_end : Nil skip_to_end, tell tell, tty? : Bool tty?, write(slice : Bytes) : Nil write, write_byte(byte : UInt8) write_byte, write_bytes(object, format : IO::ByteFormat = IO::ByteFormat::SystemEndian) write_bytes, write_utf8(slice : Bytes) write_utf8
Class methods inherited from class IO
copy(src, dst, limit : Int)copy(src, dst) copy, pipe(read_blocking = false, write_blocking = false) : Tuple(IO::FileDescriptor, IO::FileDescriptor)
pipe(read_blocking = false, write_blocking = false, &block) pipe
Instance methods inherited from class Reference
==(other : self)==(other : JSON::Any)
==(other : YAML::Any)
==(other) ==, dup dup, hash(hasher) hash, inspect(io : IO) : Nil inspect, object_id : UInt64 object_id, pretty_print(pp) : Nil pretty_print, same?(other : Reference)
same?(other : Nil) same?, to_s(io : IO) : Nil to_s
Constructor methods inherited from class Reference
new
new
Instance methods inherited from class Object
!=(other)
!=,
!~(other)
!~,
==(other)
==,
===(other : JSON::Any)===(other : YAML::Any)
===(other) ===, =~(other) =~, class class, dup dup, hash(hasher)
hash hash, inspect(io : IO)
inspect inspect, itself itself, not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, tap(&block) tap, to_json(io : IO)
to_json to_json, to_pretty_json(indent : String = " ")
to_pretty_json(io : IO, indent : String = " ") to_pretty_json, to_s
to_s(io : IO) to_s, to_yaml(io : IO)
to_yaml to_yaml, try(&block) try, unsafe_as(type : T.class) forall T unsafe_as
Constructor methods inherited from class Object
from_json(string_or_io, root : String) : selffrom_json(string_or_io) : self from_json, from_yaml(string_or_io : String | IO) : self from_yaml
Constructor Detail
Creates a new raw socket.
Class Method Detail
Instance Method Detail
Accepts an incoming connection.
Returns the client socket. Raises an IO::Error (closed stream) exception
if the server is closed after invoking this method.
require "socket"
server = TCPServer.new(2202)
socket = server.accept
socket.puts Time.now
socket.closeAccepts an incoming connection.
Returns the client Socket or nil if the server is closed after invoking
this method.
require "socket"
server = TCPServer.new(2202)
if socket = server.accept?
socket.puts Time.now
socket.close
endTries to bind the socket to a local address.
Yields an Errno error if the binding fails.
Binds the socket to a local address.
sock = Socket::Raw.udp(Socket::Family::INET)
sock.bind Socket::IPAddress.new("192.168.1.25", 80)
Raises Errno if the binding fails.
Binds the socket on port to all local interfaces.
sock = Socket::Raw.tcp(Socket::Family::INET6)
sock.bind 1234
Raises Socket::Error if the address cannot be resolved or binding fails.
Binds the socket to a local IP socket address specified by host and port.
sock = Socket::Raw.tcp(Socket::Family::INET)
sock.bind "localhost", 1234
This method involves address resolution, provided by Addrinfo.resolve.
Raises Socket::Error if the address cannot be resolved or binding fails.
Connects the socket to a socket address specified by address.
In case the connection failed, it yields an IO::Timeout or Errno error.
Connects the socket to a socket address specified by address.
sock = Socket::Raw.unix
sock.connect Socket::UNIXAddress.new("/tmp/service.sock")
Raises Socket::Error if the connection fails.
Connects the socket to a IP socket address specified by host and port.
sock = Socket::Raw.tcp(Socket::Family::INET)
sock.connect "crystal-lang.org", 80
This method involves address resolution, provided by Addrinfo.resolve.
Raises Socket::Error if the address cannot be resolved or connection fails.
The raw file-descriptor. It is defined to be an Int32, but its actual size is
platform-specific.
Returns the modified optval.
Tries to listen for connections on the previously bound socket.
Yields an Errno error if listening fails.
Tells the previously bound socket to listen for incoming connections.
Raises Errno if listening fails.
Receives a text message from the previously bound address.
server = Socket::Raw.udp(Socket::Family::INET)
server.bind("localhost", 1234)
message, client_addr = server.receiveReceives a binary message from the previously bound address.
server = Socket::Raw.udp(Socket::Family::INET)
server.bind("localhost", 1234)
message = Bytes.new(32)
bytes_read, client_addr = server.receive(message)Sends a message to the specified remote address.
server = Socket::IPAddress.new("10.0.3.1", 2022)
sock = Socket::Raw.udp(Socket::Family::INET)
sock.connect("example.com", 2000)
sock.send("text query", to: server)Sends a message to a previously connected remote address.
sock = Socket::Raw.udp(Socket::Family::INET)
sock.connect("example.com", 2000)
sock.send("text message")
sock = Socket::Raw.unix(Socket::Type::DGRAM)
sock.connect Socket::UNIXAddress.new("/tmp/service.sock")
sock.send(Bytes[0])NOTE optval is restricted to Int32 until sizeof works on variables.