2021年5月11日火曜日

Ruby で socket プログラミング

Ruby で socket プログラミング

概要

標準の socket ライブラリを使って TCP や UDP のソケットサーバを構築してみました

環境

  • macOS 11.3.1
  • Ruby 3.0.0

TCP サーバ

3 way hand shake します

require 'socket'

Socket.tcp_server_loop(12345) {|sock, client_addrinfo|
  Thread.new {
    begin
      IO.copy_stream(sock, sock)
    ensure
      sock.close
    end
  }
}

TCPServer を使っても書けます

require 'socket'

server = TCPServer.open(12345)
loop {
   Thread.start(server.accept) do |client|
     client.puts(Time.now.ctime)
     client.puts "Closing the connection. Bye!"
     client.close
   end
}

動作確認は nc を使いましょう

  • nc 127.0.0.1 12345

curl だと curl: (1) Received HTTP/0.9 when not allowed になる可能性があります

UDP サーバ

こちらは通信保証なしです
かなり簡単に書けます

require 'socket'

Socket.udp_server_loop(12345) {|msg, msg_src|
  msg_src.reply msg
}

動作確認は nc で -u オプションを使います

  • nc -u 127.0.0.1 12345

UDPSocket を使っても書けます

require 'socket'

u1 = UDPSocket.new
u1.bind("127.0.0.1", 12345)

u2 = UDPSocket.new
u2.connect("127.0.0.1", 12345)

u2.send "uuuu", 0
p u1.recvfrom(10)

おまけ: UNIXソケット

socket ファイルを使って通信します

require 'socket'

Socket.unix_server_loop("/tmp/test.sock") {|sock, client_addrinfo|
  Thread.new {
    begin
      IO.copy_stream(sock, sock)
    ensure
      sock.close
    end
  }
}

動作確認は nc で -U オプションを使います

  • nc -U /tmp/test.sock

最後に

他にもいろいろなソケットの作成方法があるのでいろいろなケースに合わせてソケット作成できるはずです

参考サイト

0 件のコメント:

コメントを投稿