2020-10-29 TCP Socket / UNIX Socket
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)
- 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"
}
}