IPSocket
IPSocket
IPSocket는 TCPSocket와 UDPSocket의 상위 클래스(super class)예요. 소켓 프로그래밍에서 IP 계열 소켓이 공통으로 가지는 기능들을 모아 두는 곳이라 할 수 있어요.
출처: Ruby 4.0 API
본문
TCPSocket나 UDPSocket로 소켓을 만들면, 이 두 클래스는 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_lookup이 true나 :hostname이면 numeric_address로 역방향 조회해서 hostname을 얻어요. false나 :numeric이면 hostname이 numeric_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은 받을 최대 바이트 수예요. flags는 Socket::MSG_* 상수들의 비트 OR 조합이에요. ipaddr는 IPSocket#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"]]