&Tgr;&eegr;&ngr; &Pgr;&agr;&rgr;, 08-03-2002 &sgr;&tgr;&igr;&sfgr; 00:39, &ogr;/&eegr; Marek Zawadzki &eacgr;&ggr;&rgr;&agr;&psgr;&egr;: > Hello, > > I've been trying to implement queuing and 'accept' in my protocol for few > weeks. > The way 'accept' should work is still not clear for me: > We have a socket s and we do the following in the server: > 1. listen(s) -- thus s->sk_state = TCP_LISTEN. > 2. accept(s) -- put a process into sleep. > ... > 3. receiving function gets an 'init' packet and looks for a socket which > matches packet's destination. The lookup returns s (!). > 4. I put s on a queue (sk->tp_pinfo.af_tcp.accept_queue) and wake up the > process (why to put s itself on it's own queue?). > 5. accept resumes, grabs first socket from the queue (s) and changes its' > state to TCP_ESTABLISHED and returns it to inet_accpet. (but this is the > same socket we've been listening on:( ). > 6. inet_accept grafts s into a new socket(ok), but s is now in > TCP_ESTABLISHED state, instead of TCP_LISTEN, which ruins next connection. > > How to keep the listening state and return the valid socket to > inet_accept, without messing with inet_accept itself? > My problem is the socket I am listening on and to which the 'init' packet > is destinated are the same. > > Thanks for anything. > -marek > When you accept a connection you don't change the listening socket to ESTABLISHED, you make a new socket in SYNRECIEVED... Harry. -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/