我在写一个服务端程序的时候。用了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分。谢谢
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分。谢谢
解决方案 »
- MFC高手请进
- 按下当前对话框确定键后对当前对话框中的Tab控件中的Page页面上的checkbox控件进行UpdateData(TRUE)绑定
- 开帖急问 SendDlgItemMessage()控制slider没有任何效果
- 如何实现CTREECTRL的拖放功能?
- 简单的命令行问题.
- 100分马上给!哪位老兄下到了前段时间的WIN2K源代码,给我一份吧~!
- 问一个关于退出程序的菜问题~~~~UP都有分~~~~~~~~~~~~~~~~~快来拿,不够再送
- 哪里可以下载到不少图标?
- 如何判断转化这段字符串?
- 如何对现场数据绘制直角坐标系
- 关于push button的消息(在线等待)
- 为什么我加了一个类后,保存并重新打开这个项目的时候这个类找不到?
{
CSocket nsock;
memset(&nfrm,0x00,sizeof(nfrm));
i=sizeof(sockaddr); if(listen_socket.Accept(nsock,&nfrm,&i)!=0) nsock.Close();
nsock.Close();
}
每循环一次,就要定义一个nsock.建议定义放到外面去。如果要有多个,可以用指针动态申请个数,也放在外面。
可能会阻塞!
而且,我也试过了将nsock放到外面定义。还是不行啊。
而且,又一个就是,如果只有一个客户端,则没有大问题。但是开了多个了,内存增加就会很快了。请高手指点。分数没问题。
那不就什么都清楚了。
将nsock放到外面定义,可以增加效率。你用while(1),如果不开多线程,那你的程序岂不是象死机了一样:)
任务管理器里看到这个程序以4k的增量增加--不知你是不是说用掉的内存在增加。
比如:
1、你为什么将CSocket变量放在循环里面?这样每循环一次,都要调用构造函数和析构函数。2、为什么不是用CSocket的事件模型?使用事件模型的话,你的程序结构会很清晰。3、你可以派生你自己的CSocket类。建议你看一看MSDN中的例子程序chatter和chatsrvr。
他是服务器/客户端应用的一个典型的框架。不过错误处理能力比较的弱,如果是开发的商业软件,需要进一步的完善。