Skip to content

Instantly share code, notes, and snippets.

@prem
Forked from dyoder/sockets.rb
Created August 28, 2008 00:52

Revisions

  1. prem revised this gist Aug 28, 2008. 1 changed file with 23 additions and 19 deletions.
    42 changes: 23 additions & 19 deletions sockets.rb
    Original file line number Diff line number Diff line change
    @@ -1,25 +1,21 @@
    require 'socket'
    require 'rubygems'
    require 'monitor'

    include Socket::Constants

    lock = Mutex.new ; buf = []
    client = Connection.new( 2201, '10.45.10.219' ).listen
    server = Connection.new( 2202, '10.45.10.219' ).connect
    stop = false


    class YPCSocket
    def initialize( port, ip )
    @socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
    @address = Socket.pack_sockaddr_in( port, ip )
    end
    def close ; @socket.close ; end
    def listen
    @socket.bind( @address ).listen( 1 )
    @socket.bind( @address )
    @socket.listen( 1 )
    end
    def connect
    @socket.connect( @address )
    @socket.connect( @address )
    end
    def accept
    Connection.new( @socket.accept.first )
    @@ -32,24 +28,32 @@ def initialize( socket )
    def read ; @socket.gets.chomp ; end
    end
    end

    def read
    connection = client.accept
    def read(connection)
    #connection = client.accept
    while ( data = connection.read && data != 'END' )
    lock.synchronize { buf << data }
    end
    stop = true
    end

    def write
    until( stop ) do
    lock.synchronize { data = buf.pop unless buf.empty? }
    server.puts( data ) if data
    end
    end


    Thread.start { read }
    Thread.start { write }

    client.close ; server.close

    lock = Mutex.new ; buf = []
    client = YPCSocket.new( 2201, '10.45.10.219' )
    client.listen
    server = YPCSocket.new( 2202, '10.45.10.219' ).connect
    stop = false

    while true
    c = client.accept
    Thread.start { read(c) }
    Thread.start { write }
    end
    client.close
    server.close
  2. dyoder revised this gist Aug 28, 2008. 1 changed file with 40 additions and 53 deletions.
    93 changes: 40 additions & 53 deletions sockets.rb
    Original file line number Diff line number Diff line change
    @@ -4,65 +4,52 @@

    include Socket::Constants

    def readthread(s, buf, conn, lock)
    while (data = s.gets)
    if(data.chomp != 'END')
    puts ">>>> before lock #{conn}"
    puts ">>>> Read #{data}"
    # lock.syncronize do
    puts ">>>> Got lock for #{conn}"
    buf.replace data
    # end
    puts ">>>> after lock #{conn}"
    s.write(buf)
    else
    w.close
    break
    lock = Mutex.new ; buf = []
    client = Connection.new( 2201, '10.45.10.219' ).listen
    server = Connection.new( 2202, '10.45.10.219' ).connect
    stop = false

    class YPCSocket
    def initialize( port, ip )
    @socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
    @address = Socket.pack_sockaddr_in( port, ip )
    end
    def close ; @socket.close ; end
    def listen
    @socket.bind( @address ).listen( 1 )
    end
    def connect
    @socket.connect( @address )
    end
    def accept
    Connection.new( @socket.accept.first )
    end

    class Connection
    def initialize( socket )
    @socket = socket
    end
    def read ; @socket.gets.chomp ; end
    end

    puts s, " connection closed\n"
    s.close
    end

    def writethread(buf, conn, lock)
    socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
    sockaddr = Socket.pack_sockaddr_in( 2202, '10.45.10.219' )
    socket.connect( sockaddr )

    5.times do
    puts "<<<< before lock #{conn}"
    lock.syncronize do
    puts "<<<< Got lock for #{conn}"
    socket.puts "#{buf}"
    puts "<<<< Sent : #{buf}"
    end
    puts "<<<< after lock #{conn}"
    end
    socket.puts "END"
    socket.close
    def read
    connection = client.accept
    while ( data = connection.read && data != 'END' )
    lock.synchronize { buf << data }
    end
    stop = true
    end


    socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
    sockaddr = Socket.pack_sockaddr_in( 2201, '10.45.10.219' )
    socket.bind( sockaddr )
    socket.listen( 5 )

    puts "Listening on 2201"
    conn = 0
    while true
    buf = Array.new(1024)
    conn = conn + 1
    lock = Monitor.new
    client, client_sockaddr = socket.accept
    puts "Got connection from #{client.inspect}. Starting thread"
    Thread.start(client) do |s|
    readthread(s, buf, conn, lock)
    end
    Thread.start do
    writethread(buf, conn, lock)
    def write
    until( stop ) do
    lock.synchronize { data = buf.pop unless buf.empty? }
    server.puts( data ) if data
    end
    end

    socket.close

    Thread.start { read }
    Thread.start { write }

    client.close ; server.close
  3. dyoder created this gist Aug 27, 2008.
    68 changes: 68 additions & 0 deletions sockets.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,68 @@
    require 'socket'
    require 'rubygems'
    require 'monitor'

    include Socket::Constants

    def readthread(s, buf, conn, lock)
    while (data = s.gets)
    if(data.chomp != 'END')
    puts ">>>> before lock #{conn}"
    puts ">>>> Read #{data}"
    # lock.syncronize do
    puts ">>>> Got lock for #{conn}"
    buf.replace data
    # end
    puts ">>>> after lock #{conn}"
    s.write(buf)
    else
    w.close
    break
    end
    end

    puts s, " connection closed\n"
    s.close
    end

    def writethread(buf, conn, lock)
    socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
    sockaddr = Socket.pack_sockaddr_in( 2202, '10.45.10.219' )
    socket.connect( sockaddr )

    5.times do
    puts "<<<< before lock #{conn}"
    lock.syncronize do
    puts "<<<< Got lock for #{conn}"
    socket.puts "#{buf}"
    puts "<<<< Sent : #{buf}"
    end
    puts "<<<< after lock #{conn}"
    end
    socket.puts "END"
    socket.close
    end


    socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
    sockaddr = Socket.pack_sockaddr_in( 2201, '10.45.10.219' )
    socket.bind( sockaddr )
    socket.listen( 5 )

    puts "Listening on 2201"
    conn = 0
    while true
    buf = Array.new(1024)
    conn = conn + 1
    lock = Monitor.new
    client, client_sockaddr = socket.accept
    puts "Got connection from #{client.inspect}. Starting thread"
    Thread.start(client) do |s|
    readthread(s, buf, conn, lock)
    end
    Thread.start do
    writethread(buf, conn, lock)
    end
    end

    socket.close