Class: UDPSocket

Inherits:
IPSocket show all
Defined in:
lib/socket/udp_socket.rb

Instance Method Summary collapse

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, #recv, #recv_nonblock, #recvmsg, #recvmsg_nonblock, #sendmsg, #sendmsg_nonblock, #setsockopt, #shutdown

Constructor Details

#initialize(family = Socket::AF_INET) ⇒ UDPSocket

Returns a new instance of UDPSocket.



2
3
4
5
6
7
8
9
10
11
12
13
# File 'lib/socket/udp_socket.rb', line 2

def initialize(family = Socket::AF_INET)
  @no_reverse_lookup = self.class.do_not_reverse_lookup
  @family            = RubySL::Socket.address_family(family)

  descriptor = RubySL::Socket::Foreign
    .socket(@family, Socket::SOCK_DGRAM, Socket::IPPROTO_UDP)

  Errno.handle('socket(2)') if descriptor < 0

  IO.setup(self, descriptor, nil, true)
  binmode
end

Instance Method Details

#bind(host, port) ⇒ Object



15
16
17
18
19
20
21
22
# File 'lib/socket/udp_socket.rb', line 15

def bind(host, port)
  addr   = Socket.sockaddr_in(port.to_i, host)
  status = RubySL::Socket::Foreign.bind(descriptor, addr)

  Errno.handle('bind(2)') if status < 0

  0
end

#connect(host, port) ⇒ Object



24
25
26
27
28
29
30
31
32
33
# File 'lib/socket/udp_socket.rb', line 24

def connect(host, port)
  sockaddr = RubySL::Socket::Foreign
    .pack_sockaddr_in(host, port.to_i, @family, Socket::SOCK_DGRAM, 0)

  status = RubySL::Socket::Foreign.connect(descriptor, sockaddr)

  RubySL::Socket::Error.write_error('connect(2)', self) if status < 0

  0
end

#inspectObject



57
58
59
# File 'lib/socket/udp_socket.rb', line 57

def inspect
  "#<#{self.class}:fd #{fileno}>"
end

#local_addressObject



61
62
63
64
65
66
# File 'lib/socket/udp_socket.rb', line 61

def local_address
  address  = addr
  sockaddr = Socket.pack_sockaddr_in(address[1], address[3])

  Addrinfo.new(sockaddr, address[0], :DGRAM)
end

#recvfrom_nonblock(maxlen, flags = 0) ⇒ Object



47
48
49
50
51
52
53
54
55
# File 'lib/socket/udp_socket.rb', line 47

def recvfrom_nonblock(maxlen, flags = 0)
  fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)

  flags = 0 if flags.nil?

  flags |= Socket::MSG_DONTWAIT

  recvfrom(maxlen, flags)
end

#remote_addressObject



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

def remote_address
  address  = peeraddr
  sockaddr = Socket.pack_sockaddr_in(address[1], address[3])

  Addrinfo.new(sockaddr, address[0], :DGRAM)
end

#send(message, flags, host = nil, port = nil) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/socket/udp_socket.rb', line 35

def send(message, flags, host = nil, port = nil)
  if host and port
    addr = Socket.sockaddr_in(port.to_i, host)
  elsif host
    addr = host
  else
    addr = nil
  end

  super(message, flags, addr)
end