请教一个linux socket程序的问题,请各位大虾多多帮助!!!~~~

请教一个linux socket程序的问题,请各位大虾多多帮助!!!~~~

我有个服务器程序是在linux运行的server,当初我把它给设计成I/O复用的select服务器。但是需要多用
户连接,所以在里面加了进程,每一个客户连接,服务器就产生一个fork,依然用select但是这样,我想
至少有两个不好的地方:
1。服务器不能产生过多的fork,所以不能处理连接过多的情况。所以我想,是不是当一个客户端长时间
    没有反应时,就断掉这个连接和进程。但是怎么做呢?
2。客户端断掉时,服务器不知道,所以,服务器端会有很多进程没有关掉,造成浪费MEMROR.
3。如果我有数据向客户端发送,如果数据大与1M 那么,我怎样才能正确的发送出去呢?
请了解的朋友看看有没有好的解决办法,多谢啦!
服务器的简单设计方式:
     。。。
    socket(,,,);
    bzero(,,,);
    client_addr.sin_family=AF_INET;
    client_addr.sin_port=htons(MY_PORT);
    client_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    bind(,,,listen_fd,(struct sockaddr *)&client_addr,sizeof(client_addr))<0)
    listen(,,,listen_fd,5)
    while(1)
    {
        fd_set rdfdset;
        accept_fd=accept(listen_fd,NULL,NULL);
        ,,
        if((n=fork())==0)
        {
            /* 子进程处理客户端的连接 */
                while(1)
                {
                FD_ZERO(&rdfdset);
                FD_SET(accept_fd,&rdfdset);
                if(select(FD_SETSIZE,&rdfdset,NULL,NULL,NULL)<0)
                {
                    printf("select failed");
                    exit(0);
                }
                if(FD_ISSET(accept_fd,&rdfdset))
                {
                    if(n = read(accept_fd,buffer,1024))
                    {
                              process.....;
                             write(accept_fd,buffer,n);
                    }
                }
               
                exit(0);
            }
            else if(n<0)
                printf("Fork Error:%s\n\a",strerror(errno));
            
           close(accept_fd);
      }
}
      
select的最后一个参数是控制时间的,设置了就行了,问题1,2都可以解决
如果是要发送的数据是文件,需要select以下描述字:读网络socket, 读文件描述字,写网络socket      
select 里面设置的时间只是设置一个连接有多长时间没有反应,我想如果客户端突然断掉了,那么我在服务器端就没有可能检测到这种情况,有位网友给我说了一个心跳检测这种方法,具体的我就不大清楚了,好象是 服务器每隔一段时间向已连接的客户端(一个链表保存连接的客户们的信息)发送一个消息,如果客户端收到,马上回应。但是具体的情况我也不清楚怎么做。还有,因为服务器是多进程的,如果进程创建的多的话,就不能在创建了,请问有没有好的解决方法。
  说实话我觉得我这个服务器模型是是而非的,一个fork里面有一个select 这样很不好,我也说不上来,但是觉得总是不是个很有效的服务器程序,请问你有没有好的多用户socket服务器连接方案?请给我一些提示。多谢了。如果有这方面的资料的话请大虾发送到我的信箱里面    jiafahehe@sohu.com      
长时间不回应当然就认为断了,大部分FTP服务器不都是这样嘛

可加大系统的进程限制,如果是用Linux2.4的话,调整/proc/sys/kernel/threads-max的值,另外用线程比进程速度快一些      
谢谢!还有个问题,如果要发送的东西很大(从数据库里取出的数据),怎样有效发送呢?      
直接发就是,怎么有效那是TCP管的事      
server 与client连接成功后,server从数据库里取出数据,然后封装成struct*
struct与数据库表的类型一样,如 struct stt{ int id, char[30] name,,,,}
然后申请一片内存,把数据拷贝到这片内存里面,再用一个char* str 指向这片内存,

然后把这个str发送到client
char *str;
int isize;
char *temp;
isize = 1024*1024;
str = malloc(isize);//分配内存
memcpy( str, 你的结构体变量指针, sizeof(你的结构体));//把结构数据考到内存中。 memcpy(temp,str+i*1024,1024);///send temp to client,size equal to isize 这样用到大的内存片,str+i*1024是内存偏移但是,我不是很清楚这种方法,知情者,请告诉我
free(str);
....
send(accept_client_fd,temp,sizeof(temp));
....
问题:
1。我向client要发送多个表中的数据,那么我怎么才能让client知道接收到的是哪个表数据。
2。接收到数据后怎样还原出数据来,client也有与server相同的struct我在client 端怎样还原它呢?