WEBrick doesn't work (permission/port error)

P

P. A.

Hi.

I get an error when I start a WEBrick server.

Here's my application.

# server.rb
# encoding: utf-8

require 'webrick'

class Server
class << self
def start(config = {})
config.merge:)BindAddress => '0.0.0.0', :port => 4321)
server = WEBrick::HTTPServer.new(config)
trap('INT') { server.shutdown }
end
end
end

Server.start

$ ruby1.9.2dev server.rb
[2009-12-08 00:21:53] INFO WEBrick 1.3.1
[2009-12-08 00:21:53] INFO ruby 1.9.2 (2009-11-14) [i686-linux]
[2009-12-08 00:21:58] WARN TCPServer Error: Permission denied - bind(2)
[2009-12-08 00:21:58] WARN TCPServer Error: Permission denied - bind(2)
/opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in `initialize':
Permission denied - bind(2) (Errno::EACCES)
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in
`new'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in
`block in create_listeners'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:70:in
`each'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:70:in
`create_listeners'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/server.rb:74:in
`listen'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/server.rb:62:in
`initialize'
from
/opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/httpserver.rb:24:in
`initialize'
from server.rb:24:in `new'
from server.rb:24:in `start'
from server.rb:31:in `<main>'

When I start it as a root I get another error.

# ruby1.9.2dev server.rb
[2009-12-08 00:26:18] INFO WEBrick 1.3.1
[2009-12-08 00:26:18] INFO ruby 1.9.2 (2009-11-14) [i686-linux]
[2009-12-08 00:26:23] WARN TCPServer Error: Address already in use -
bind(2)

I also get these errors while I use a stable version of Ruby (1.9.1). I
haven't got any other applications working on port 4321.

Debian GNU/Linux 5.0.3;
Ruby 1.9.1, 1.9.2dev;
WEBrick 1.3.1.

What is the reason of this bug?

Thanks.
 
L

Luis Lavena

Hi.

I get an error when I start a WEBrick server.

Here's my application.

# server.rb
# encoding: utf-8

require 'webrick'

class Server
  class << self
    def start(config = {})
      config.merge:)BindAddress => '0.0.0.0', :port => 4321)
      server = WEBrick::HTTPServer.new(config)
      trap('INT') { server.shutdown }
    end
  end
end

Server.start

$ ruby1.9.2dev server.rb
[2009-12-08 00:21:53] INFO  WEBrick 1.3.1
[2009-12-08 00:21:53] INFO  ruby 1.9.2 (2009-11-14) [i686-linux]
[2009-12-08 00:21:58] WARN  TCPServer Error: Permission denied - bind(2)
[2009-12-08 00:21:58] WARN  TCPServer Error: Permission denied - bind(2)
/opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in `initialize':
Permission denied - bind(2) (Errno::EACCES)
        from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in
`new'
        from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in
`block in create_listeners'
        from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:70:in
`each'
        from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:70:in
`create_listeners'
        from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/server.rb:74:in
`listen'
        from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/server.rb:62:in
`initialize'
        from
/opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/httpserver.rb:24:in
`initialize'
        from server.rb:24:in `new'
        from server.rb:24:in `start'
        from server.rb:31:in `<main>'

When I start it as a root I get another error.

# ruby1.9.2dev server.rb
[2009-12-08 00:26:18] INFO  WEBrick 1.3.1
[2009-12-08 00:26:18] INFO  ruby 1.9.2 (2009-11-14) [i686-linux]
[2009-12-08 00:26:23] WARN  TCPServer Error: Address already in use -
bind(2)

I also get these errors while I use a stable version of Ruby (1.9.1). I
haven't got any other applications working on port 4321.

Debian GNU/Linux 5.0.3;
Ruby 1.9.1, 1.9.2dev;
WEBrick 1.3.1.

What is the reason of this bug?

Is not a bug, it clearly indicates that another process/server is
already bound to that port.

Please verify that your script wasn't running in the background or you
using a port that is already in use by other program/service.
 
P

P. A.

I solved it by myself.

The problem was that I stated a WEBrick server without initial
configuration because I used the Hash#merge method instead Hash#merge!
(mutator).

So, the code should be changed to work properly.

# IT DOESN'T WORKS!
# encoding: utf-8

require 'webrick'

class Server
class << self
def start(config = {})
config.merge:)BindAddress => '0.0.0.0', :port => 4321) # the error
source
puts config # returns {} on start
server = WEBrick::HTTPServer.new(config)
trap('INT') { server.shutdown }
server.start
end
end
end

# WORKS!
# encoding: utf-8

require 'webrick'

class Server
class << self
def start(config = {})
config.merge!:)BindAddress => '0.0.0.0', :port => 4321) # changes
the config hash
puts config # returns {:BindAddress => '0.0.0.0', :port => 4321}
on start
server = WEBrick::HTTPServer.new(config)
trap('INT') { server.shutdown }
server.start
end
end
end

Cheers!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,152
Latest member
LorettaGur
Top