Skip to content

Instantly share code, notes, and snippets.

@ganmacs
Created January 28, 2019 09:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ganmacs/6ea405c83842516ad96880913fcfee2e to your computer and use it in GitHub Desktop.
Save ganmacs/6ea405c83842516ad96880913fcfee2e to your computer and use it in GitHub Desktop.
require 'socket'
class Server
def call
File.unlink('socket1')
File.unlink('socket2')
server1 = UNIXServer.new('socket1')
server2 = UNIXServer.new('socket2')
v = Queue.new
socks = {
server1 => 0,
server2 => 0,
}
# socks = {}
# socks << {}
# [0, server1.accept]
# socks << [0, server2.accept]
Thread.new(socks) do |socks|
begin
asocks = socks.keys
loop do
ios, _ = IO.select([asocks], [])
ios.each do |io|
_ = io[0].read(1)
vv = v.pop
io.send_io(vv)
vv.close
socks[io] += 1
end
end
rescue => e
p e
end
end
sock = TCPServer.new(50051)
sock.listen(Socket::SOMAXCONN) # TODO make backlog configurable if necessary
while s = sock.accept
v.push(s)
end
end
end
fork do
sleep 1
sock = UNIXSocket.new('socket1')
loop do
sock.write_nonblock('v')
fd = sock.recv_io(TCPSocket)
puts "socket1"
sleep 1
puts fd.gets
fd.puts("hi")
fd.close
end
end
fork do
sleep 1
sock = UNIXSocket.new('socket2')
loop do
sock.write_nonblock('v')
fd = sock.recv_io(TCPSocket)
puts "socket2"
puts fd.gets
fd.puts("hi")
fd.close
end
end
Server.new.call
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment