Class: TCPServer

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

Instance Attribute Summary

Attributes inherited from BasicSocket

#do_not_reverse_lookup

Instance Method Summary collapse

Methods inherited from IPSocket

#addr, getaddress, #peeraddr, #recvfrom

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, open, pipe, popen, #pos=, #printf, read, #rewind

Constructor Details

#initialize(host = nil, service) ⇒ TCPServer

call-seq:

TCPServer.new(host=nil, service) -> tcpserver

Creates a new TCP server socket bound to the given host and service. If host is nil, binds to all available interfaces.

server = TCPServer.new("localhost", 8080)
server = TCPServer.new(nil, 3000)  # binds to all interfaces
server = TCPServer.new("0.0.0.0", "http")


569
570
571
572
573
574
575
576
577
578
579
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 569

def initialize(host=nil, service)
  ai = Addrinfo.getaddrinfo(host, service, nil, nil, nil, Socket::AI_PASSIVE)[0]
  @init_with_fd = true
  super(Socket._socket(ai.afamily, Socket::SOCK_STREAM, 0), "r+")
  if Socket.const_defined?(:SO_REUSEADDR)
    self.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
  end
  Socket._bind(self.fileno, ai.to_sockaddr)
  listen(5)
  self
end

Instance Method Details

#acceptObject

call-seq:

tcpserver.accept -> tcpsocket

Accepts an incoming connection and returns a new TCPSocket.

server = TCPServer.new(8080)
client = server.accept


590
591
592
593
594
595
596
597
598
599
600
601
602
603
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 590

def accept
  fd = self.sysaccept
  begin
    s = TCPSocket._allocate
    s.instance_eval{
      @init_with_fd = true
    }
    s.__send__(:initialize, fd, "r+")
    s
  rescue => e
    IO._sysclose(fd) rescue nil
    raise e
  end
end

#accept_nonblockObject

call-seq:

tcpserver.accept_nonblock -> unixsocket

Accepts an incoming connection without blocking. May raise an exception if no connection is available.

client = server.accept_nonblock


614
615
616
617
618
619
620
621
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 614

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

#listen(backlog) ⇒ Object

call-seq:

unixserver.listen(backlog) -> 0

Sets the socket to listen for incoming connections with the given backlog.

server.listen(5)
server.listen(128)


632
633
634
635
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 632

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

#sysacceptObject

call-seq:

tcpserver.sysaccept -> integer

Accepts an incoming connection and returns the file descriptor.

fd = server.sysaccept


645
646
647
# File 'mrbgems/mruby-socket/mrblib/socket.rb', line 645

def sysaccept
  Socket._accept(self.fileno)
end