I wrote a little news feed client program called nntp-listen, and I run it with
the following command:

/usr/local/bin/supervise /root/news/supervise/server/ \
        /usr/local/bin/tcpserver 0 119 /root/news/nntp-listen 2>&1 \
        | /usr/local/bin/accustamp \
        | /usr/local/bin/cyclog /root/news/log/server/ &

This works great when the news feed server obeys the RFC.  But sometimes the
news feed server disconnects before typing the QUIT command.  This leaves an
"nntp-listen" process waiting for more input.  What do I have to do to make
tcpserver communicate to nntp-listen that the connection is gone?

For example, here is what the listening processes look like before a
connection:

[root@feedclient news]# ps auxw | egrep 'RSS|nntp' | grep -v egrep
USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
root      3948  0.0  0.4   736   260  p2 S   Dec 31   0:00 /usr/local/bin/supervise 
/root/news/supervise/server/ /usr/local/bin/tcpserver 0 119 /root/news/nntp-
root      3951  0.0  0.5   812   356  p2 S   Dec 31   0:00 /usr/local/bin/tcpserver 0 
119 /root/news/nntp-listen 
[root@feedclient news]# 

Netstat says nothing about nntp:

[root@feedclient news]# netstat -A inet | grep nntp | grep -v egrep
[root@feedclient news]# 

Now I will open a feed to feedclient:

[dave@knave dave]$ telnet feedclient 119
Trying 207.168.228.71...
Connected to feedclient.directint.net.
Escape character is '^]'.
200 feed news server ready - posting ok


At this point, let's look at the status on feedclient again:

[root@feedclient news]# ps auxw | egrep 'RSS|nntp' | grep -v egrep
USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
root      3948  0.0  0.4   736   260  p2 S   Dec 31   0:00 /usr/local/bin/supervise 
/root/news/supervise/server/ /usr/local/bin/tcpserver 0 119 /root/news/nntp-
root      3951  0.0  0.5   812   356  p2 S   Dec 31   0:00 /usr/local/bin/tcpserver 0 
119 /root/news/nntp-listen 
root      8748  1.4  2.8  2532  1856  p2 S    04:07   0:00 perl -w 
/root/news/nntp-listen 
[root@feedclient news]# netstat -A inet | grep nntp | grep -v egrep
tcp        0      0 feedclient.directint.:nntp knave.directint.ne:8031 ESTABLISHED 
[root@feedclient news]# 

Now I'll close the feed without typing "quit," and we'll check the status on
feedclient again:

[root@feedclient news]# ps auxw | egrep 'RSS|nntp' | grep -v egrep
USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
root      3948  0.0  0.4   736   260  p2 S   Dec 31   0:00 /usr/local/bin/supervise 
/root/news/supervise/server/ /usr/local/bin/tcpserver 0 119 /root/news/nntp-
root      3951  0.0  0.5   812   356  p2 S   Dec 31   0:00 /usr/local/bin/tcpserver 0 
119 /root/news/nntp-listen 
root      8748  4.0  2.9  2536  1864  p2 R    04:07   0:05 perl -w 
/root/news/nntp-listen 
[root@feedclient news]# netstat -A inet | grep nntp | grep -v egrep
tcp        0      0 feedclient.directint.:nntp knave.directint.ne:8031 CLOSE_WAIT  
[root@feedclient news]# 

As you can see, the "nntp-listen" process never gets told to quit.  This means
that if the feed opens and rudely closes the connection over and over again,
tcpserver will keep spawning new nntp-listen processes.  Obviously this quickly
makes the load on the client rise unacceptably.  How can I fix this?

Thanks,
Dave

Reply via email to