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.cr

Constructors

Class Method Summary

Instance Method Summary

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) : Number
read_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) : Nil
each_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) : self
from_json(string_or_io) : self
from_json
, from_yaml(string_or_io : String | IO) : self from_yaml

Constructor Detail

def self.new(family : Family, type : Type, protocol : Protocol = Protocol::IP, *, blocking : Bool = false) #

Creates a new raw socket.


[View source]
def self.new(fd : Int32, family, type, protocol = Protocol::IP, *, blocking : Bool = false) #

[View source]

Class Method Detail

def self.fcntl(fd, cmd, arg = 0) #

[View source]

Instance Method Detail

def accept #

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.close

[View source]
def accept? #

Accepts 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
end

[View source]
def bind(addr : Address | Addrinfo, &block) #

Tries to bind the socket to a local address.

Yields an Errno error if the binding fails.


[View source]
def bind(addr : Address | Addrinfo) #

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.


[View source]
def bind(port : Int) #

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.


[View source]
def bind(host : String, port : Int) #

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.


[View source]
def blocking #

[View source]
def blocking=(value) #

[View source]
def close_on_exec=(arg : Bool) #

[View source]
def close_on_exec? #

[View source]
def close_read #

Calls shutdown(2) with SHUT_RD


[View source]
def close_write #

Calls shutdown(2) with SHUT_WR


[View source]
def closed? : Bool #

[View source]
def connect(address : Address | Addrinfo, *, connect_timeout = nil, &block : IO::Timeout | Errno -> ) #

Connects the socket to a socket address specified by address.

In case the connection failed, it yields an IO::Timeout or Errno error.


[View source]
def connect(address : Address | Addrinfo, *, connect_timeout = nil) : Nil #

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.


[View source]
def connect(host : String, port : Int, *, dns_timeout = nil, connect_timeout = nil) #

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.


[View source]
def family : Family #

[View source]
def fcntl(cmd, arg = 0) #

[View source]
def fd : Int32 #

The raw file-descriptor. It is defined to be an Int32, but its actual size is platform-specific.


[View source]
def finalize #

[View source]
def getsockopt(optname, optval, level = LibC::SOL_SOCKET) #

Returns the modified optval.


[View source]
def getsockopt_bool(optname, level = LibC::SOL_SOCKET) #

[View source]
def inspect(io) #

[View source]
def listen(*, backlog : Int32 = SOMAXCONN, &block) #

Tries to listen for connections on the previously bound socket.

Yields an Errno error if listening fails.


[View source]
def listen(*, backlog : Int32 = SOMAXCONN) #

Tells the previously bound socket to listen for incoming connections.

Raises Errno if listening fails.


[View source]
def local_address : Address #

Returns the Address for the local end of the socket.


[View source]
def protocol : Protocol #

[View source]
def receive(*, max_message_size = 512) : Tuple(String, Address) #

Receives a text message from the previously bound address.

server = Socket::Raw.udp(Socket::Family::INET)
server.bind("localhost", 1234)

message, client_addr = server.receive

[View source]
def receive(message : Bytes) : Tuple(Int32, Address) #

Receives 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)

[View source]
def remote_address : Address #

Returns the Address for the remote end of the socket.


[View source]
def send(message, *, to addr : Address) #

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)

[View source]
def send(message) #

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])

[View source]
def setsockopt(optname, optval, level = LibC::SOL_SOCKET) #

NOTE optval is restricted to Int32 until sizeof works on variables.


[View source]
def setsockopt_bool(optname, optval : Bool, level = LibC::SOL_SOCKET) #

[View source]
def tty? #

[View source]
def type : Type #

[View source]