Class: Socket

Inherits:
BasicSocket show all
Defined in:
mrbgems/mruby-socket/mrblib/socket.rb

Instance Attribute Summary

Attributes inherited from BasicSocket

#do_not_reverse_lookup

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BasicSocket

do_not_reverse_lookup, do_not_reverse_lookup=, for_fd, #local_address, #recv_nonblock, #remote_address

Methods inherited from IO

#each, #each_byte, #each_char, #hash, pipe, popen, #pos=, #printf, read, #rewind

Constructor Details

#initialize(domain, type, protocol = 0) ⇒ Socket

call-seq:

Socket.new(domain, type, protocol=0) -> socket

Creates a new socket with the given domain, type, and protocol.

sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
sock = Socket.new(Socket::AF_UNIX, Socket::SOCK_DGRAM)


754
755
756
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 754

def initialize(domain, type, protocol=0)
  super(Socket._socket(domain, type, protocol), "r+")
end

Class Method Details

.getaddrinfo(nodename, servname, family = nil, socktype = nil, protocol = nil, flags = 0) ⇒ Object

call-seq:

Socket.getaddrinfo(nodename, servname, family=nil, socktype=nil, protocol=nil, flags=0) -> array

Returns an array of Addrinfo objects for the given nodename and servname.

Addrinfo.getaddrinfo("localhost", "http")
Addrinfo.getaddrinfo("www.example.com", 80, Socket::AF_INET)


769
770
771
772
773
774
775
776
777
778
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 769

def self.getaddrinfo(nodename, servname, family=nil, socktype=nil, protocol=nil, flags=0)
  Addrinfo.getaddrinfo(nodename, servname, family, socktype, protocol, flags).map {|ai|
    ary = ai._to_array
    ary[2] = nodename
    ary[4] = ai.afamily
    ary[5] = ai.socktype
    ary[6] = ai.protocol
    ary
  }
end

.open(*args) ⇒ Object

call-seq:

Socket.open(domain, type, protocol=0) -> socket

Creates a new socket. Alias for Socket.new.

sock = Socket.open(Socket::AF_INET, Socket::SOCK_STREAM)


791
792
793
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 791

def self.open(*args)
  new(args)
end

.sockaddr_in(port, host) ⇒ Object Also known as: pack_sockaddr_in

call-seq:

Socket.sockaddr_in(port, host) -> string

Returns a packed sockaddr_in structure for the given port and host.

Socket.sockaddr_in(80, "127.0.0.1")
Socket.sockaddr_in(443, "localhost")


804
805
806
807
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 804

def self.sockaddr_in(port, host)
  ai = Addrinfo.getaddrinfo(host, port, nil, Socket::SOCK_DGRAM)[0]
  ai.to_sockaddr
end

.unpack_sockaddr_in(sa) ⇒ Object

call-seq:

Socket.unpack_sockaddr_in(sockaddr) -> [port, ip_address]

Unpacks a packed sockaddr_in structure and returns port and IP address.

port, addr = Socket.unpack_sockaddr_in(sockaddr)


828
829
830
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 828

def self.unpack_sockaddr_in(sa)
  Addrinfo.new(sa).ip_unpack.reverse
end

.unpack_sockaddr_un(sa) ⇒ Object

call-seq:

Socket.unpack_sockaddr_un(sockaddr) -> path

Unpacks a packed sockaddr_un structure and returns the Unix socket path.

path = Socket.unpack_sockaddr_un(sockaddr)


840
841
842
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 840

def self.unpack_sockaddr_un(sa)
  Addrinfo.new(sa).unix_path
end

Instance Method Details

#acceptObject



850
851
852
853
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 850

def accept
  fd, addr = self.sysaccept
  [ Socket.for_fd(fd), addr ]
end

#accept_nonblockObject



855
856
857
858
859
860
861
862
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 855

def accept_nonblock
  begin
    self._setnonblock(true)
    self.accept
  ensure
    self._setnonblock(false)
  end
end

#bind(sockaddr) ⇒ Object

call-seq:

socket.bind(sockaddr) -> 0

Binds the socket to the given socket address.

sock.bind(Socket.sockaddr_in(8080, "127.0.0.1"))
sock.bind(addrinfo)


873
874
875
876
877
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 873

def bind(sockaddr)
  sockaddr = sockaddr.to_sockaddr if sockaddr.is_a? Addrinfo
  Socket._bind(self.fileno, sockaddr)
  0
end

#connect(sockaddr) ⇒ Object

call-seq:

socket.connect(sockaddr) -> 0

Connects the socket to the given socket address.

sock.connect(Socket.sockaddr_in(80, "127.0.0.1"))
sock.connect(addrinfo)


888
889
890
891
892
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 888

def connect(sockaddr)
  sockaddr = sockaddr.to_sockaddr if sockaddr.is_a? Addrinfo
  Socket._connect(self.fileno, sockaddr)
  0
end

#connect_nonblock(sockaddr) ⇒ Object

call-seq:

socket.connect_nonblock(sockaddr) -> 0

Connects the socket to the given address without blocking. May raise an exception if the connection cannot be completed immediately.

sock.connect_nonblock(sockaddr)


903
904
905
906
907
908
909
910
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 903

def connect_nonblock(sockaddr)
  begin
    self._setnonblock(true)
    self.connect(sockaddr)
  ensure
    self._setnonblock(false)
  end
end

#listen(backlog) ⇒ Object

def ipv6only!



914
915
916
917
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 914

def listen(backlog)
  Socket._listen(self.fileno, backlog)
  0
end

#recvfrom(maxlen, flags = 0) ⇒ Object



919
920
921
922
923
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 919

def recvfrom(maxlen, flags=0)
  msg, sa = _recvfrom(maxlen, flags)
  socktype = self.getsockopt(Socket::SOL_SOCKET, Socket::SO_TYPE).int
  [ msg, Addrinfo.new(sa, Socket::PF_UNSPEC, socktype) ]
end

#recvfrom_nonblock(*args) ⇒ Object



925
926
927
928
929
930
931
932
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 925

def recvfrom_nonblock(*args)
  begin
    self._setnonblock(true)
    self._recvfrom(*args)
  ensure
    self._setnonblock(false)
  end
end

#sysacceptObject



934
935
936
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 934

def sysaccept
  Socket._accept2(self.fileno)
end