我在写一个服务端程序的时候。用了CSocket类,具体如下:
CSocket listen_socket;
sockaddr     nfrm;if(!listen_socket.Create(m_uPort,SOCK_STREAM,m_strHost))
    return 0;
if(!listen_socket.Listen (CONNNUM))
{
    listen_socket.Close();
    return 0;
}
while(1)
{  
    CSocket      nsock;
        
    memset(&nfrm,0x00,sizeof(nfrm));
    i=sizeof(sockaddr);    if(listen_socket.Accept(nsock,&nfrm,&i)!=0) nsock.Close();
    nsock.Close();
}
就这么简单的一个框架。但是在客户端不断的连接情况下,我在任务管理器里看到这个程序以4k的增量增加。百思不得其解。请高手指点。如果正确给100分。谢谢

解决方案 »

  1.   

    while(1)
    {  
        CSocket      nsock;
            
        memset(&nfrm,0x00,sizeof(nfrm));
        i=sizeof(sockaddr);    if(listen_socket.Accept(nsock,&nfrm,&i)!=0) nsock.Close();
        nsock.Close();
    }
    每循环一次,就要定义一个nsock.建议定义放到外面去。如果要有多个,可以用指针动态申请个数,也放在外面。
      

  2.   

    if(listen_socket.Accept(nsock,&nfrm,&i)!=0)
    可能会阻塞!
      

  3.   

    可是,这个程序我其实是放在一个单独的线程里面的呀!
    而且,我也试过了将nsock放到外面定义。还是不行啊。
    而且,又一个就是,如果只有一个客户端,则没有大问题。但是开了多个了,内存增加就会很快了。请高手指点。分数没问题。
      

  4.   

    可能listen_socket每次调用Accept时,会分配一些内部对象使用,而且直到listen_socket对象析构的时候才释放掉,你看看CAsyncSocket::Accept的原码.
      

  5.   

    但是,这个程序应该不会调用到listen_socket的析够函数。如果永远不调用那么,内存不是一直要增加下去吗?其他人难道不是这么写的吗?
      

  6.   

    你有没有想过,用相反的立场看这个问题你可以在客户端建立套接字,bind 和listen有客户端来完成,把以前客户端请求连接服务器的条件加到服务器上去,让服务器来判断连接条件,这样的话,服务器就不会一直在等待监听了,将资源消耗到客户端上面,服务器端判断自身的条件,当要对客户端进行操作的话,在connect客户端就可以了。这个只是我的想法,不一定在你的程序里能用上,仅供你参考。我自己编的一个程序就是这么编的:)
      

  7.   

    为什么自己不设置断点调试呢!?再看看listen,create,accept等函数是否成功调用了,你的close()函数执行了没有,程序阻塞了没有...
    那不就什么都清楚了。
    将nsock放到外面定义,可以增加效率。你用while(1),如果不开多线程,那你的程序岂不是象死机了一样:)
    任务管理器里看到这个程序以4k的增量增加--不知你是不是说用掉的内存在增加。
      

  8.   

    你的这段程序问题很多!
    比如:
    1、你为什么将CSocket变量放在循环里面?这样每循环一次,都要调用构造函数和析构函数。2、为什么不是用CSocket的事件模型?使用事件模型的话,你的程序结构会很清晰。3、你可以派生你自己的CSocket类。建议你看一看MSDN中的例子程序chatter和chatsrvr。
    他是服务器/客户端应用的一个典型的框架。不过错误处理能力比较的弱,如果是开发的商业软件,需要进一步的完善。