List Info

Thread: Re: Rebind after process crash -- quasi-n00b sockets issue




Re: Rebind after process crash -- quasi-n00b sockets issue
country flaguser name
United States
2008-05-12 14:20:08

--- In ts-7000%40yahoogroups.com">ts-7000yahoogroups.com, "Fred" <frice...> wrote:
&gt;
> Greetings, mailing list!
&gt;
> Running TS-Linux on the Ts-7250, I get a problem that I've not
> encountered on any other socket-based platform, a problem with the
> bind() call after my process crashes and then gets re-launched.
>
> When my process launches, I call bind() to a port number and
> everything runs perfectly. If for any reason my process crashes, a
> process monitoring process that I also have running notices that my
> process has crashed and it will re-launch my dead process.
>
> The bind() call, however, fails the second time my process is
> launched, probably because the port number is still marked as in use
> in the TCP/IP stack, and won't get released until the stack performs
> clean-up the next time it's scheduled.
>
> I've not had this problem under Trumpet Winsock under Windows 3.11
> (which, bless me, I'm still using at home because I run Ham Radio
> TNCs and old stuff, some of it under CP/M.)
&gt;
> Isn't sockopt with option REUSE supposed to allow me to rebind the
> same port number?
>
> Any way, I greatly appreciate any help anyone can offer. Maybe
> there's a socket call I'm unaware of that will force an existing
> binding on a dead process' port number to be relinquished, maybe.
&gt;
> Thanks!
>
This works for me:
// Create socket for listening for client connection requests.
listenSocket = socket(AF_INET, SOCK_STREAM, 0);
if (listenSocket < 0) {
syslog(LOG_ERR,";cannot create listen socket&quot;);
exit(EXIT_FAILURE);
}

....

/* Enable address reuse. If previously interrupted in the middle of
communication, tcp stack is in TIME_WAIT state.
* This skips waiting for this timeout */
on = 1;
res = setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, &on,
sizeof(on));

if (bind(listenSocket, (struct sockaddr *) &serverAddress,
sizeof(serverAddress)) < 0) {
syslog(LOG_ERR,";cannot bind socket&quot;);
exit(EXIT_FAILURE);
}
....

__._,_.___
.

__,_._,___
Re: Rebind after process crash -- quasi-n00b sockets issue
country flaguser name
United States
2008-05-12 16:55:23

--- "dokapra" <nebojsa...> wrote:
&gt; /* Enable address reuse. If previously interrupted in
> the middle of communication, tcp stack is in TIME_WAIT state.
&gt; * This skips waiting for this timeout */
> on = 1;
> res = setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, &on,
> sizeof(on));
>
> if (bind(listenSocket, (struct sockaddr *) &serverAddress,
> sizeof(serverAddress)) < 0) {
> syslog(LOG_ERR,";cannot bind socket&quot;);
> exit(EXIT_FAILURE);
> }

Yeah, I'm employing REUSEADDR but the problem is
that I am relaunching a process that died and left
a previous bind()ing behind. When the process is
launched again, bind() fails because the TCP/IP
stack claims there's already a process listening
on that UDP port. REUSEADDR doesn't solve that
problem, alas. }:-}

__._,_.___
.

__,_._,___
[1-2]

about | contact  Other archives ( Real Estate discussion Medical topics )