Wroking with TCP Socket でSocketについて学んでいる。

Socket.new

Socket.new(:INET, :STREAM) # TCP socket
Socket.new(:INET, :DGRAM)  # UDP socket
Socket.new(:UNIX, :STREAM) # UNIX stream socket
Socket.new(:UNIX, :DGRAM)  # UNIX datagram socket

int socket(int domain, int type, int protocol);

  • AF_UNIX, AF_LOCAL ローカル通信 unix(7)
  • AF_INET IPv4 インターネットプロトコル ip(7)
  • AF_INET6 IPv6 インターネットプロトコル ipv6(7)

Man page of SOCKET

  • SOCK_STREAM: 順序性と信頼性があり、双方向の、接続された バイトストリーム (byte stream) を提供する。 帯域外 (out-of-band) データ転送メカニズムもサポートされる
    • TCP
  • SOCK_DGRA: データグラム (コネクションレス、信頼性無し、固定最大長メッセージ) をサポートする。
    • UDP

RubyでいろいろなSocket作って遊んでみた。 - Qiita

require 'socket'

Socket.open(:INET, :DGRAM) do |sock|
  addr = Socket.sockaddr_in(9001, '127.0.0.1')
  sock.send('hello inet dgram', 0, addr)
end

Socket.open(:UNIX, :DGRAM) do |sock|
  addr = Socket.sockaddr_un('/tmp/unix_dgram.socket')
  sock.send('hello unix dgram', 0, addr)
end

Socket.open(:INET, :STREAM) do |sock|
  addr = Socket.sockaddr_in(9002, '127.0.0.1')
  sock.connect addr
  sock.write 'hello inet stream'
  p sock.gets
end

Socket.open(:UNIX, :STREAM) do |sock|
  addr = Socket.sockaddr_un('/tmp/unix_stream.socket')
  sock.connect addr
  sock.write 'hello unix stream'
  p sock.gets
end

Class: TCPServer (Ruby 2.7.2)

require 'socket'

server = TCPServer.new(2000) # Server bind to port 2000
loop do
  client = server.accept # Wait for a client to connect
  client.puts "Hello !"
  client.puts "Time is #{Time.now}"
  client.close
end

↑これで立つサーバーに対して下記のncコマンドを打つと、client.putsの出力が返ってくる。

$ nc localhost 2000
Hello !
Time is 2020-11-04 18:38:19 +0900

Class: UNIXServer (Ruby 2.7.2)

require 'socket'

UNIXServer.open("/tmp/sock") { |serv|
  UNIXSocket.open("/tmp/sock") { |c|
    s = serv.accept
    s.puts "hi"
    s.close
    p c.read #=> "hi\n"
  }
}