# Problem with bind for Socket class

**URL:** <https://www.ruby-forum.com/t/problem-with-bind-for-socket-class/150851>\
**Category:** Ruby\
**Created:** [October 14, 2008, 7:47am UTC](https://www.ruby-forum.com/t/problem-with-bind-for-socket-class/150851 "2008-10-14T07:47:53Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [October 14, 2008, 7:47am UTC](https://www.ruby-forum.com/t/problem-with-bind-for-socket-class/150851/1 "2008-10-14T07:47:53Z")

</div>

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](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.

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [October 14, 2008, 8:32am UTC](https://www.ruby-forum.com/t/problem-with-bind-for-socket-class/150851/2 "2008-10-14T08:32:59Z")

</div>

On 14.10.2008 07:47, Vladimir F. wrote:

> 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

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [October 14, 2008, 8:35am UTC](https://www.ruby-forum.com/t/problem-with-bind-for-socket-class/150851/3 "2008-10-14T08:35:19Z")

</div>

On Tue, Oct 14, 2008 at 03:30:05PM +0900, Robert K. wrote:

> > 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?

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.

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [October 14, 2008, 9:26am UTC](https://www.ruby-forum.com/t/problem-with-bind-for-socket-class/150851/4 "2008-10-14T09:26:58Z")

</div>

On Oct 14, 8:34 am, Vladimir F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> > > Could anybody
> 
> 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.

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [October 14, 2008, 9:12am UTC](https://www.ruby-forum.com/t/problem-with-bind-for-socket-class/150851/5 "2008-10-14T09:12:53Z")

</div>

2008/10/14 Vladimir F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > > 
> > 
> > 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 ?

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

---

<div class="post-metadata">

**Author:** ![Vladimir\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/ac91a4/32.png) [@Vladimir\_F](https://www.ruby-forum.com/u/Vladimir_F)\
**Post date:** [October 14, 2008, 10:19am UTC](https://www.ruby-forum.com/t/problem-with-bind-for-socket-class/150851/6 "2008-10-14T10:19:27Z")

</div>

Hi,

On Tue, Oct 14, 2008 at 04:26:20PM +0900, Antonin A. wrote:

> > > > /t1.rb:10:in `bind’: Address already in use - bind(2) (Errno::EADDRINUSE)
> 
> 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.
