IPSocket

IPSocket

IPSocketTCPSocketUDPSocket의 상위 클래스(super class)예요. 소켓 프로그래밍에서 IP 계열 소켓이 공통으로 가지는 기능들을 모아 두는 곳이라 할 수 있어요.

출처: Ruby 4.0 API

본문

TCPSocketUDPSocket로 소켓을 만들면, 이 두 클래스는 IPSocket을 상속받기 때문에 여기 있는 공통 메서드들을 함께 쓸 수 있어요. 주소를 조회하거나(getaddress), 소켓 자신의 주소나 상대방 주소를 알아내는(addr, peeraddr) 일이 대표적이에요.

클래스 메서드

getaddress(host)        → ipaddress

host의 IP 주소를 조회해요.

require 'socket'

IPSocket.getaddress("localhost")     #=> "127.0.0.1"
IPSocket.getaddress("ip6-localhost") #=> "::1"

getaddress_orig는 이 메서드의 별칭이에요.

인스턴스 메서드

addr([reverse_lookup]) → [address_family, port, hostname, numeric_address]

소켓의 로컬 주소를 [address_family, port, hostname, numeric_address] 형태의 배열로 돌려줘요.

reverse_lookuptrue:hostname이면 numeric_address로 역방향 조회해서 hostname을 얻어요. false:numeric이면 hostnamenumeric_address와 같아요. nil이거나 생략하면 ipsocket.do_not_reverse_lookup 설정을 따르죠. Socket.getaddrinfo도 함께 참고하면 좋아요.

TCPSocket.open("www.ruby-lang.org", 80) {|sock|
  p sock.addr #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
  p sock.addr(true)  #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
  p sock.addr(false) #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"]
  p sock.addr(:hostname)  #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
  p sock.addr(:numeric)   #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"]
}

역방향 조회를 켜면 hostname으로 hal 같은 이름이, 끄면 그 자리에 숫자 주소가 들어가는 게 보이죠.

inspect   → string

IPSocket 객체를 설명하는 문자열을 돌려줘요.

peeraddr([reverse_lookup]) → [address_family, port, hostname, numeric_address]

상대방(원격) 주소를 [address_family, port, hostname, numeric_address] 배열로 돌려줘요. TCPSocket처럼 연결 지향(connection oriented) 소켓에 정의돼 있어요. reverse_lookup 인자의 동작은 addr와 같아요.

TCPSocket.open("www.ruby-lang.org", 80) {|sock|
  p sock.peeraddr #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"]
  p sock.peeraddr(true)  #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"]
  p sock.peeraddr(false) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"]
  p sock.peeraddr(:hostname) #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"]
  p sock.peeraddr(:numeric)  #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"]
}
recvfrom(maxlen)        → [mesg, ipaddr]
recvfrom(maxlen, flags) → [mesg, ipaddr]

메시지를 받아서 문자열 mesg와 그 메시지가 온 주소 ipaddr를 돌려줘요. maxlen은 받을 최대 바이트 수예요. flagsSocket::MSG_* 상수들의 비트 OR 조합이에요. ipaddrIPSocket#peeraddr/addr과 같은 형태의 배열이에요.

u1 = UDPSocket.new
u1.bind("127.0.0.1", 4913)
u2 = UDPSocket.new
u2.send "uuuu", 0, "127.0.0.1", 4913
p u1.recvfrom(10) #=> ["uuuu", ["AF_INET", 33230, "localhost", "127.0.0.1"]]