Reusing a port after a crash

Luke Dean LukeD at pobox.com
Thu Apr 21 13:39:46 PDT 2005


>> From time to time, my torrent filesharing application will crash or need 
>> to be killed.  The application is configured to listen on a specific port. 
>> If I try to restart the application after improper termination, I receive a 
>> fatal error message stating that the port is already in use.
>> 
>> Before restarting the application, I verify that the application did indeed 
>> shut down (via 'ps -aux') and 'sockstat -l' shows that no application is 
>> using the port in question, so I don't understand how the port could still 
>> be 'in use'.
>> 
>> The only way I've found to restart the application after improper 
>> termination is to reboot the whole system.  Is there something else I could 
>> try?  Does this kind of thing tend to happen to network applications when 
>> they crash or could this be specific to my application?
>
> What little tinkering I've done in the socket world reminds me of this:
>
> --------------------------------------------------------------
> % man setsockopt
>
> ...
>
> SO_REUSEADDR       enables local address reuse
> SO_REUSEPORT       enables duplicate address and port bindings
>
> ...
>
> SO_REUSEADDR indicates that the rules used in validating addresses sup-
> plied in a bind(2) call should allow reuse of local addresses.
> SO_REUSEPORT allows completely duplicate bindings by multiple processes
> if they all set SO_REUSEPORT before binding the port.  This option per-
> mits multiple instances of a program to each receive UDP/IP multicast or
> broadcast datagrams destined for the bound port.
> --------------------------------------------------------------
>
>
> Basically, what I remember about this is that if you supply those options 
> when creating the socket and your app crashes, you can start it back up using 
> the same host:port otherwise you get the message you're getting...
>
> I'm sure a good networking would be able to explain it better...

Thanks!  That's what I needed to know.  I didn't know such options 
existed.

I poked around in the code for the app, and even though I know next to 
nothing about python I found that there's a "reuse" parameter on the call 
that binds the listening port, and it's defaulting to "false".  I bet if 
I explicitly set it to "true" that I'll get the behavior I want (or break 
the whole thing...)
Open Source is fun.  :)

Luke Dean


More information about the freebsd-questions mailing list