TCPSocket

TCPSocket (TCP/IP 클라이언트 소켓)

TCPSocketTCP/IP 클라이언트 소켓을 나타내요. 간단한 클라이언트는 이렇게 생겼어요.

require 'socket'

s = TCPSocket.new 'localhost', 2000

while line = s.gets # 소켓에서 줄을 읽어서
  puts line         # 출력하고
end

s.close             # 다 쓰면 소켓을 닫아요

출처: Ruby 4.0 API

본문

클래스 메서드 (Public Class Methods)

gethostbyname(hostname) → [official_hostname, alias_hostnames, address_family, *address_list]

Addrinfo.getaddrinfo를 대신 쓰세요. 이 메서드는 다음과 같은 이유로 deprecated예요.

  • 결과의 3번째 요소가 첫 주소의 address family이고, 나머지 주소들의 address family는 돌려주지 않아요.
  • gethostbyname()은 오래 걸릴 수 있고 다른 스레드를 블록할 수 있어요. (thread safe 하지 않아 GVL을 놓아줄 수 없어요.)
  • 이 메서드는 POSIX에서 이미 제거된 gethostbyname() 함수를 사용해요.

이 메서드는 hostname으로 호스트 정보를 조회해요.

TCPSocket.gethostbyname("localhost")
#=> ["localhost", ["hal"], 2, "127.0.0.1"]

new(remote_host, remote_port, local_host=nil, local_port=nil, resolv_timeout: nil, connect_timeout: nil, open_timeout: nil, fast_fallback: true)

remote_hostremote_port로 TCP 연결을 열어요. local_hostlocal_port를 지정하면 그 로컬 쪽 값을 이용해 연결을 맺어요.

Ruby 3.4부터 이 메서드는 Windows를 제외하면 기본적으로 Happy Eyeballs Version 2 (RFC 8305) 알고리즘으로 동작해요. 자세한 내용은 Socket.tcp_fast_fallback=을 참고하세요. Ruby 3.3 이하와 동일하게 동작하게 하려면 fast_fallback: false를 명시하거나, Socket.tcp_fast_fallback=false로 설정하면 이 메서드뿐 아니라 모든 Socket에서 전역적으로 Happy Eyeballs Version 2를 끄게 돼요. Windows에서는 Happy Eyeballs Version 2가 제공되지 않아 Ruby 3.3 이하와 동일하게 동작해요.

  • :resolv_timeout - 호스트명 해석이 시작되는 시점부터의 제한 시간(초)을 지정해요.
  • :connect_timeout - 이 메서드는 후보 목적지 주소 전체에 순차적으로 연결을 시도해요. connect_timeout은 연결 시도 시작부터 마지막 후보까지의 제한 시간(초)을 지정해요. 기본적으로 모든 연결 시도는 제한 시간이 올 때까지 계속돼요. fast_fallback: false를 명시하면 각 연결 시도마다 제한 시간이 설정되고, 그 제한 시간을 넘는 연결 시도는 취소돼요.
  • :open_timeout - 메서드 실행 시작부터의 제한 시간(초)을 지정해요. 아직 연결 시도하지 않은 주소가 남은 채 이 제한 시간에 도달하면 더 이상 시도하지 않아요. 이 옵션을 다른 타임아웃 옵션과 함께 지정하면 ArgumentError가 발생해요.
  • :fast_fallback - Happy Eyeballs Version 2 알고리즘을 활성화해요. (기본값은 활성화)