这可能是什么问题造成的呢?

我的一个系统作为服务器运行一段时间(大概一周),客户端就无法访问了,ping可以通,但是telnet IP时提示all port in use,closed by host.我的系统中有一个SOCKET的通信程序,记得好象建立socket有个数限制,出现上面的错误会是什么原因呢?请高手指教

什么情况会导致出现“所有的端口都被使用”这样的错误呢?在我的系统中有一个通信程序通过socket通信,
通过fd=socket(AF_INET,SOCK_STREAM,0);创建fd,当发现tcp连接断开时
close(fd)然后重建,这有问题吗?

作为服务器.为什么要close()呢?基本上,
socket()返回的listenfd 不用close.你可以一直使用.
accept()返回的connfd ,在客户端连接完后才需要close().当然你也可以放在客户端close().例子:

#include	"unp.h"
#include	<time.h>

int
main(int argc, char **argv)
{
	int					listenfd, connfd;
	struct sockaddr_in	servaddr;
	char				buff[MAXLINE];
	time_t				ticks;

	listenfd = Socket(AF_INET, SOCK_STREAM, 0);

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family      = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port        = htons(13);	/* daytime server */

	Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

	Listen(listenfd, LISTENQ);

	for ( ; ; ) {
		connfd = Accept(listenfd, (SA *) NULL, NULL);

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        Write(connfd, buff, strlen(buff));

		Close(connfd);
	}
}

可是telnet时显示“所有端口都被使用”是为什么呢?记得telnet用的是23端口,另外很奇怪ftp可以访问,还有系统不正常前telnet也可以,即使我的通信程序有问题也不会影响telnet呀?

感觉像受到了DOS攻击:)
不知道是fd用完了.还是连接没有释放?不知道你写的socket程序是简单的,还是有多进程,多线程,如果有,需要close的就更多了.先检查一下你写的socket程序吧.有时候看起来很迷惑的BUG.也是有内在必然的联系的.一些参考:

----------------------------------------------
每个进程默认fd是1000个.你可用下面例子中的命令证实一下.(如果有PHOTON,也用psin代替sin,一个图形界面).
致于为什么ftp可以telnet不可以.也许你可以用 pidin fa 看看他们之间的关系.我相信是同一进程的影响吧.

1.TCP/IP limits
The number of open connections and sockets is limited only by memory and by the maximum number of file descriptors per process

2.File descriptors
The total number of file descriptors has a hard limit of 32767 per process, but you’re more likely to be constrained by the -F option to procnto or the RLIMIT_NOFILE system resource. The default value is 1000; the minimum is 100.

*Sockets, named semaphores, message queues, channel IDs (chids), and connection IDs (coids) all use file descriptors.

ulimit -a

time(cpu-seconds) unlimited
file(blocks) unlimited
coredump(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) unlimited
lockedmem(kbytes) unlimited
memory(kbytes) unlimited
nofiles(descriptors) 1000
processes unlimited
vmemory(kbytes) unlimited

sin -P telnetd fds

telnetd 1363981 108K 128K 12K 516K 29
0 36874 WR 0/0 I4T 192.168.0.71.23 192.168.0.77.3813
1 36874 WR 0/0 I4T 192.168.0.71.23 192.168.0.77.3813
2 36874 WR 0/0 I4T 192.168.0.71.23 192.168.0.77.3813
4 20486 WR 0/0 /dev/ptyp0
5 20486 WR 0/0 /dev/ttyp0
0s 1


----------------------------------------------
用 netstat 看看系统的连接.看是不是越来越多?

还有一个想得到的,服务器程序通常要设SO_KEEPALIVE;这样,即使客户端突然断线,服务器端也不会死等。(当然,如果你的协议里已经考虑了这种情况的话,就不用设了)。

这个选项还可以再设TCP_KEEPALIVE来设置超时时间。