Socket

�����åȤ��Τ�Τ��Ф��륷���ƥॳ�����٥�Υ����������� ���륯�饹��Perl�Υ����åȤ��Ф��륢��������Ʊ��٥�ε�ǽ�� �󶡤��Ƥޤ������Υ��饹�Ǥϥ����åȥ��ɥ쥹�� pack ���줿ʸ����ǻ��ꤷ�ޤ� (�����åȥ��ɥ쥹��¤�Τ� pack ����ʸ�����򻲾�)��

����Ū�ʥ����åȥץ�����ߥ󥰤Ϥ����٥�� TCPSocket���饹�� TCPServer���饹���Ѥ� �ƹԤ��뤳�Ȥ�¿�������Υ��饹�Ϥ��ޤ��Ѥ����ޤ���

�����ѡ����饹:

���饹�᥽�å�:

Socket.open(domain, type, protocol)
Socket.new(domain, type, protocol)

�����������åȤ��������ޤ���domain��type�� protocol �ϥ��󥯥롼�ɥե�����ˤ�������ǻ��ꤷ�� �����ۤȤ�ɤ������ Socket::AF_INET �Τ褦�� Socket ���饹������Ȥ����������Ƥ��ޤ���domain ��type �˴ؤ��Ƥϡ�"AF_INET", "SOCK_STREAM" �Τ褦��ʸ����Ǥ����Ǥ��ޤ�����ʸ ����Ǥ��٤Ƥε�ǽ�����Ǥ����ݾڤϤ���ޤ���

Socket.for_fd(fd)

�ե�����ǥ�������ץ� fd ���Ф��뿷���������åȤ��������ޤ���

ruby 1.7 feature: ���Υ᥽�åɤ� BasicSocket �˰�ư���ޤ�����

Socket.getaddrinfo(nodename, servname[, family[, socktype[, protocol[, flags]]]])

RFC 2553��������줿 getaddrinfo()�ε�ǽ���󶡤��륯�饹�᥽�åɡ����δؿ��� gethostbyname()��getservbyname()������Ȥ����Ѱդ���Ƥ��ꡢ IP�ΥС������˰�¸���ʤ��ץ�������񤯤����ɸ��Ū��API�Ǥ���

���ɥ쥹�����������֤��ޤ������ɥ쥹����Ȥ�7�Ĥ����Ǥ���ʤ뼡�� ��������Ǥ���

  • ��0���� - ���ɥ쥹�ե��ߥ꡼(String)��
  • ��1���� - �ݡ����ֹ�(Integer)��
  • ��2���� - �ۥ���̾(String)��
  • ��3���� - ���ɥ쥹(String)��
  • ��4���� - ���ɥ쥹�ե��ߥ꡼���б�����Integer��
  • ��5���� - �����åȥ����פ��б�����Integer��
  • ��6���� - �ץ��ȥ�����б�����Integer��

ɬ�ܰ����ΰ�̣�ϰʲ����̤�Ǥ���

�Ĥ�ΰ����Ͼ�ά��ǽ�Ǥ���

  • family - ���ɥ쥹�ե��ߥ꡼�� Socket::AF_INET �ʤɡ� ���ɥ쥹�ե��ߥ꡼�ˤ����������ꤷ�ޤ���
  • socktype - �����åȥ����ס� Socket::SOCK_STREAM �ʤɡ� �����åȥ������ˤ����������ꤷ�ޤ���
  • protocol - �ץ��ȥ��롣 Socket::IPPROTO_IP �ʤɡ� �ץ��ȥ����ˤ����������ꤷ�ޤ���
  • flags - getaddrinfo(3)����3�����˻��ꤹ��addrinfo��¤�Τ� ai_flags ���Ф���������Fixnum�� Socket::AI_PASSIVE�� Socket::AI_CANONNAME�� Socket::AI_NUMERICHOST ���Ѱդ���Ƥ����礬����ޤ���

�����˻���Ǥ�������ΰ�̣�ˤĤ��Ƥ� getaddrinfo(3) �򻲾Ȥ��Ʋ�������

��: *1

p Socket.getaddrinfo(Socket.gethostname, "ftp")
#=> [["AF_INET", 21, "helium.ruby-lang.org", "210.251.121.214", 2, 1, 6]]

pp Socket.getaddrinfo(Socket.gethostname, nil)
#=> [["AF_INET", 0, "helium.ruby-lang.org", "210.251.121.214", 2, 1, 6],
#    ["AF_INET", 0, "helium.ruby-lang.org", "210.251.121.214", 2, 2, 17],
#    ["AF_INET", 0, "helium.ruby-lang.org", "210.251.121.214", 2, 3, 0]]
Socket.getnameinfo(sa[, flags])

RFC 2553 ��������줿getnameinfo() �ε�ǽ���󶡤��륯 �饹�᥽�åɡ� gethostbyaddr() �� getservbyport() ���� ���Ȥ����Ѱդ���Ƥ��ޤ���IP�ΥС������˰�¸���ʤ��ץ������� �񤯤����ɸ��Ū��API�Ǥ���

������֤����������Ǥϥ��ɥ쥹�ȥݡ��Ȥ�ɽ��ʸ����Ǥ���

���� sa �ˤ�ʸ���������Ϳ���ޤ���ʸ����ξ��� sockaddr ��¤�� �Υѥå�ʸ�����Ϳ���ޤ�������Ū�ˤ� getsockaddr ���ͤ����ѤǤ��ޤ��������Ϳ������ˤϡ����Ǥ�3�Ĥξ���4�Ĥξ�� ������ޤ���

  • ���Ǥ�3�Ĥξ��:

    [���ɥ쥹�ե��ߥ꡼, �����ӥ�, �ۥ���]
    
  • ���Ǥ�4�Ĥξ��:

    [���ɥ쥹�ե��ߥ꡼, �����ӥ�, Ǥ��, ���ɥ쥹��ɽ��ʸ����]
    

���ɥ쥹�ե��ߥ꡼�ˤ� Socket::AF_INET ���������¾��ʸ���� �� "AF_INET" �⤷���� "AF_INET6" �⤷���� nil �� ����Ǥ��ޤ���������IPv6���Ȥ��ʤ��褦�˥���ѥ��뤵��Ƥ������ "AF_INET6" ��̵���ʻ���Ȥʤ�ޤ������ɥ쥹�ե��ߥ꡼�� nil ����ꤹ�뤳�Ȥ� Socket::AF_UNSPEC ����ꤹ�뤳�� �������Ǥ���

�����ӥ����ۥ��Ȥλ���˴ؤ��Ƥ� �����ӥ���������� �ۥ��Ȼ�������򻲾Ȥ��Ƥ���������

���Ǥ�3�Ĥξ��Ǥ⡢�ۥ��Ȥˤϥ��ɥ쥹�����Ǥ��ޤ��������Ǥ�4�� �ξ��ˤϡ��Ǹ�����Ǥ�̾����褷�ʤ����Ȥ��ݾڤ���ޤ���*2

��ά��ǽ����2���� flags �ˤ� getnameinfo(3) ����7���ܤΰ����˻��ꤹ�� flags ���������� Fixnum ��Ϳ���ޤ���

����flags�������뤿�������Ȥ��� Socket::NI_MAXHOST�� Socket::NI_MAXSERV�� Socket::NI_NOFQDN�� Socket::NI_NUMERICHOST�� Socket::NI_NAMEREQD�� Socket::NI_NUMERICSERV�� Socket::NI_DGRAM ���Ѱդ���Ƥ����礬����ޤ���

����������ΰ�̣�ˤĤ��Ƥ� getnameinfo(3)�򻲾� ���Ʋ�������

��:

Socket.getnameinfo(Socket.sockaddr_in('21','127.0.0.1'))
#=> ["localhost", "ftp"]

Socket.getnameinfo([nil, 21,'127.0.0.1'])
#=> ["localhost", "ftp"]
Socket.gethostbyaddr(host[, type])

sockaddr ��¤�Τ�ѥå�����ʸ���󤫤�ۥ��Ⱦ�����֤��ޤ��� �ۥ��Ⱦ���ι�¤�� Socket.gethostbyname��Ʊ���Ǥ��� type �ˤϡ����ɥ쥹������(�ǥե���Ȥ� Socket::AF_INET)����ꤷ�ޤ���

Socket.gethostbyname(host)

�ۥ���̾�ޤ���IP���ɥ쥹(������ˡ�˴ؤ��Ƥ� �ۥ��Ȼ�������򻲾�) ����ۥ��Ȥξ�����֤��ޤ��� �ۥ��Ⱦ���ϰʲ��� 4 ���Ǥ������ɽ������Ƥ��ޤ���

  • �ۥ���̾
  • �ۥ��Ȥ���̾������
  • �ۥ��ȤΥ��ɥ쥹������ (�������)
  • �ۥ��ȤΥ��ɥ쥹

������ǤΥۥ��ȤΥ��ɥ쥹�ϡ��ƥ��ɥ쥹�����פ��б����� C �Υ��ɥ쥹��¤�Τ� pack ����ʸ����Ȥ���ɽ������Ƥ��ޤ��� �㤨�Х��ɥ쥹�����פ� AF_INET (��� 2) �ʤ�� Socket.unpack_sockaddr_in �� unpack �Ǥ��ޤ���

��:
irb(main):009:0> Socket.gethostbyname("210.251.121.214")
["helium.ruby-lang.org", ["helium"], 2, "\322\373y\326"]

irb(main):009:0> Socket.unpack_sockaddr_in(Socket.gethostbyname("210.251.121.214")[3])[1]
"210.251.121.214"
Socket.gethostname

�����ƥ��ɸ��Υۥ���̾��������ޤ��� �ۥ��Ȥ���̾�䥢�ɥ쥹�ʤ�¾�ξ��������ˤ� Socket.getaddrinfo ��ȤäƤ���������

p Socket.gethostname   #=> "helium.ruby-lang.org"
Socket.getservbyname(service[, proto])

service, proto���б�����ݡ����ֹ���� ���ޤ���proto�ξ�ά�ͤ�"tcp"�Ǥ���

Socket.sockaddr_in(port, host) ((<ruby 1.7 feature>))
Socket.pack_sockaddr_in(port, host) ((<ruby 1.7 feature>))

���ꤷ�����ɥ쥹�������åȥ��ɥ쥹��¤�Τ� pack ����ʸ���� ���֤��ޤ���port �ϡ��ݡ����ֹ��ɽ�� Fixnum ���뤤�ϡ��ݡ��� �ֹ桢�����ӥ�̾��ɽ��ʸ����Ǥ���

require 'socket'
p Socket.pack_sockaddr_in("echo", "localhost")
=> "\002\000\000\a\177\000\000\001\000\000\000\000\000\000\000\000"
Socket.sockaddr_un(path) ((<ruby 1.7 feature>))
Socket.pack_sockaddr_un(path) ((<ruby 1.7 feature>))

���ꤷ�����ɥ쥹�������åȥ��ɥ쥹��¤�Τ� pack ����ʸ���� ���֤��ޤ���

require 'socket'
p Socket.pack_sockaddr_un("/tmp/.X11-unix/X0")
=> "\001\000/tmp/.X11-unix/X0\000...."
Socket.pair(domain, type, protocol)
Socket.socketpair(domain, type, protocol)

��ߤ˷�礵�줿�����åȤΥڥ���ޤ�2���Ǥ�������֤��ޤ��� �����λ����Socket.open��Ʊ���Ǥ���

Socket.unpack_sockaddr_in(addr) ((<ruby 1.7 feature>))

�����åȥ��ɥ쥹��¤�Τ� pack ����ʸ������ unpack �������ɥ쥹���֤��ޤ����֤�����ͤ� [port, ipaddr] ������Ǥ���

require 'socket'
p Socket.unpack_sockaddr_in(Socket.pack_sockaddr_in("echo", "localhost"))
=> [7, "127.0.0.1"]
Socket.unpack_sockaddr_un(addr) ((<ruby 1.7 feature>))