mtsu@blake.acs.washington.edu (Montana State) (03/01/89)
Hokay, I hope this is a really stupid question... E-mail responses if this
is too basic...
I have this program I'm writing which is running as a server on our network.
Everything works fine, except when I'm all done, or I get an error
condition, I just want to blow the whole thing away and restart. What I have
so far is:
All the socket set up stuff
execute garbage, return answer
If error then
shutdown(socket,(int)2);
close(socket)
execve(argv[0],argv,envp);
The execve executes, but the program bombs on the bind() call with
an "address already in use" message. How do I get this "address"
released so I can restart it. Or is execve the wrong call??
Jaye Mathisen
icsu6000@caesar.cs.montana.eduugoday@sunybcs.uucp (Abdi Oday) (03/04/89)
In article <1006@blake.acs.washington.edu> icsu6000@caesar.cs.montana.edu (Jaye Mathisen) writes: > > >Everything works fine, except when I'm all done, or I get an error >condition, I just want to blow the whole thing away and restart. What I have >so far is: > > All the socket set up stuff > execute garbage, return answer > If error then > shutdown(socket,(int)2); > close(socket) > > execve(argv[0],argv,envp); > >The execve executes, but the program bombs on the bind() call with >an "address already in use" message. How do I get this "address" >released so I can restart it. Or is execve the wrong call?? > >Jaye Mathisen >icsu6000@caesar.cs.montana.edu I think what you want to do is queue thinks up on your socket. In other words, on the "listen" call, you tell it how many calls to queue up. example: listen(socket, 10) will queue up 10 requests. Otherwise after you close connection, it takes a while (sometimes 2 minutes ... I don't understand why) for a bind to work. Hope that helps -Abdi Abdi Oday Phone: (716) 636-3004 University at Buffalo BITNET: ugoday@sunybcs.BITNET Internet: ugoday@cs.Buffalo.EDU UUCP: ...!{ames,boulder,decvax,rutgers}!sunybcs!ugoday
andrew@alice.UUCP (Andrew Hume) (03/05/89)
i understand the problem to be that if you tear down a socket that you got as a result of listening to an address that you 'bind'ed to and then attempt to bind again, you get an address in use error. this is annoyingly correct behaviour. some standard says the address is taken for up to 4 minutes. i have a similar problem and i adopt the sendmail approach (it has to be good for something, right?) and set some socket option to reuse the address and then just rebind over the top.
rayan@cs.toronto.edu (Rayan Zachariassen) (10/27/89)
Speaking of sockets, why doesn't SIGIO seem to work on a bound and listened-to but not accepted file descriptor? Assume the FASYNC flag is set and the notified-pid is correct. Did I do something else wrong? Would SIGPOLL work in that situation if the networking was streams-based instead of 4.3 code ? Yes, select would work, but I'd like an async (non-polled) notification that someone is trying to talk to me.
ecsv24@castle.ed.ac.uk (J Bradfield) (10/28/89)
I have a problem understanding the behaviour of sockets, though the
answer may involve the stdio library instead.
On Suns or Pyramids, consider the following sequence of events:
Server Process Client Process
listen's on a TCP port
accept's connect's to server
fdopen's socket & setbuf's to fdopen's socket
unbuffered
receives data (fscanf etc) and sends data (fprintf etc) and rewind's
rewind's
sends data receives data
getc's on the socket stream
process receives signal and signal
handler exits.
putc's one character on socket stream
returns without error
putc's one character again
returns error indication
Why does the server process get an error on the second putc, not the first?