Problem with bind for Socket class

V

Vladimir Fekete

Hi *,
I have following problem, I'm playing with socket class and I wanted to
test the example from

http://www.ruby-doc.org/stdlib/libdoc/socket/rdoc/index.html

e.g.:
#-------------------------------------------------------------------
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
socket.bind( sockaddr )
socket.listen( 5 )
client_fd, client_sockaddr = socket.sysaccept
client_socket = Socket.for_fd( client_fd )
puts "The client said, '#{client_socket.readline.chomp}'"
client_socket.puts "Hello from script one!"
socket.close
#-------------------------------------------------------------------

I changed the code slightly to :

#-------------------------------------------------------------------
require 'socket'
include Socket::Constants

$shutdown = false

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

loop do
if (IO.select([socket],nil,nil,0.1)!=nil) then
client, client_sockaddr = socket.accept
puts "NEW CLIENT : " + client_sockaddr.inspect.to_s
Thread.start(client) do |a|
str = a.recv(100);
$shutdown = true if str=="shutdown"
a.close
puts str.to_s + " " + $shutdown.to_s
end
end

break if $shutdown==true
end

puts "SHutting down..."
socket.close
#--------------------------------------------------------------------

when I tested it it worked. But when I tried to run it again I've got error
message:

/t1.rb:10:in `bind': Address already in use - bind(2) (Errno::EADDRINUSE)
from ./t1.rb:10

I tried to find "related" bug/problem in google but withouth success. Could anybody
help me how to "unbind" socket ? Or explain me where I making mistake. I have
some experiences only with WinSock API and I don't remember any unbind function.
Many thanks!

Cheers,

V.

P.S. I'm running it on Debian Linux, Ruby version 1.8.
 
R

Robert Klemme

when I tested it it worked. But when I tried to run it again I've got error
message:

/t1.rb:10:in `bind': Address already in use - bind(2) (Errno::EADDRINUSE)
from ./t1.rb:10

I tried to find "related" bug/problem in google but withouth success. Could anybody
help me how to "unbind" socket ? Or explain me where I making mistake. I have
some experiences only with WinSock API and I don't remember any unbind function.
P.S. I'm running it on Debian Linux, Ruby version 1.8.

I remember that on some OS (or particular versions) socket cleanout is
delayed. Did you try to check with "netstat -a -n | fgrep 2201" or
similar to see what state the port is in?

Cheers

robert
 
V

Vladimir Fekete

I remember that on some OS (or particular versions) socket cleanout is
delayed. Did you try to check with "netstat -a -n | fgrep 2201" or
similar to see what state the port is in?

Yes you are right, after circa 5 minutes it works again. So you say it is
problem (issue) of OS and not ruby, yes ?

Cheers,

V.
 
R

Robert Klemme

2008/10/14 Vladimir Fekete said:
Yes you are right, after circa 5 minutes it works again. So you say it is
problem (issue) of OS and not ruby, yes ?

Maybe. You would have to check the web for the particular version of
OS you use and system settings to be sure.

In any case I would change the code in a way to ensure the socket is
properly closed when the program terminates (either via begin - ensure
- end or via at_exit).

Kind regards

robert
 
A

Antonin Amand

Yes you are right, after circa 5 minutes it works again. So you say it is
problem (issue) of OS and not ruby, yes ?

If you want to reuse the port you must set this flag on the socket
before you bind it.
When you use this kind of option you must ensure that you can't run
multiple instances of the program.
Use a lock file or something.

socket.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)

Cheers.
 
V

Vladimir Fekete

Hi,


If you want to reuse the port you must set this flag on the socket
before you bind it.
When you use this kind of option you must ensure that you can't run
multiple instances of the program.
Use a lock file or something.

socket.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)

nope, no help. I still have to wait.

V.
 

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

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,008
Latest member
HaroldDark

Latest Threads

Top