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