Class: TCPServer

Inherits:
TCPSocket show all
Defined in:
lib/socket/tcp_server.rb

Instance Method Summary collapse

Methods inherited from TCPSocket

gethostbyname, #local_address, #remote_address

Methods inherited from IPSocket

#addr, getaddress, #peeraddr, #recvfrom

Methods inherited from BasicSocket

#close_read, #close_write, #connect_address, do_not_reverse_lookup, #do_not_reverse_lookup, do_not_reverse_lookup=, #do_not_reverse_lookup=, for_fd, #getpeereid, #getpeername, #getsockname, #getsockopt, #local_address, #recv, #recv_nonblock, #recvmsg, #recvmsg_nonblock, #remote_address, #send, #sendmsg, #sendmsg_nonblock, #setsockopt, #shutdown

Constructor Details

#initialize(host, service = nil) ⇒ TCPServer

Returns a new instance of TCPServer.



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/socket/tcp_server.rb', line 2

def initialize(host, service = nil)
  @no_reverse_lookup = self.class.do_not_reverse_lookup

  if host.is_a?(Fixnum) and service.nil?
    service = host
    host    = nil
  end

  if host.is_a?(String) and service.nil?
    begin
      service = Integer(host)
    rescue ArgumentError
      raise SocketError, "invalid port number: #{host}"
    end

    host = nil
  end

  unless service.is_a?(Fixnum)
    service = RubySL::Socket.coerce_to_string(service)
  end

  if host
    host = RubySL::Socket.coerce_to_string(host)
  else
    host = ''
  end

  remote_addrs = Socket
    .getaddrinfo(host, service, :UNSPEC, :STREAM, 0, Socket::AI_PASSIVE)

  remote_addrs.each do |addrinfo|
    _, port, address, _, family, socktype, protocol = addrinfo

    descriptor = RubySL::Socket::Foreign.socket(family, socktype, protocol)

    next if descriptor < 0

    status = RubySL::Socket::Foreign
      .bind(descriptor, Socket.sockaddr_in(port, address))

    if status < 0
      RubySL::Socket::Foreign.close(descriptor)

      Errno.handle('bind(2)')
    else
      IO.setup(self, descriptor, nil, true)
      binmode
      setsockopt(:SOCKET, :REUSEADDR, true)

      break
    end
  end

  listen(5)
end

Instance Method Details

#acceptObject



63
64
65
66
67
# File 'lib/socket/tcp_server.rb', line 63

def accept
  socket, _ = RubySL::Socket.accept(self, TCPSocket)

  socket
end

#accept_nonblockObject



69
70
71
72
73
# File 'lib/socket/tcp_server.rb', line 69

def accept_nonblock
  socket, _ = RubySL::Socket.accept_nonblock(self, TCPSocket)

  socket
end

#listen(backlog) ⇒ Object



59
60
61
# File 'lib/socket/tcp_server.rb', line 59

def listen(backlog)
  RubySL::Socket.listen(self, backlog)
end

#sysacceptObject



75
76
77
# File 'lib/socket/tcp_server.rb', line 75

def sysaccept
  accept.fileno
end