关于CSocket类的Accept来者有分!

richardxulf 2002-09-12 06:43:51
我在写一个服务端程序的时候。用了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分。谢谢
...全文
41 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dou_ya 2002-09-16
  • 打赏
  • 举报
回复
你的这段程序问题很多!
比如:
1、你为什么将CSocket变量放在循环里面?这样每循环一次,都要调用构造函数和析构函数。

2、为什么不是用CSocket的事件模型?使用事件模型的话,你的程序结构会很清晰。

3、你可以派生你自己的CSocket类。

建议你看一看MSDN中的例子程序chatter和chatsrvr。
他是服务器/客户端应用的一个典型的框架。不过错误处理能力比较的弱,如果是开发的商业软件,需要进一步的完善。
richardxulf 2002-09-13
  • 打赏
  • 举报
回复
可是,这个程序我其实是放在一个单独的线程里面的呀!
而且,我也试过了将nsock放到外面定义。还是不行啊。
而且,又一个就是,如果只有一个客户端,则没有大问题。但是开了多个了,内存增加就会很快了。请高手指点。分数没问题。
yixin22 2002-09-13
  • 打赏
  • 举报
回复
你把这个程序放到线程里吧,应该影响会消除.
yongdu 2002-09-13
  • 打赏
  • 举报
回复
好像没有内存泄露啊
fhzhen 2002-09-13
  • 打赏
  • 举报
回复
up
ccnuxjg 2002-09-13
  • 打赏
  • 举报
回复
if(listen_socket.Accept(nsock,&nfrm,&i)!=0)
可能会阻塞!
ccnuxjg 2002-09-13
  • 打赏
  • 举报
回复
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.建议定义放到外面去。如果要有多个,可以用指针动态申请个数,也放在外面。
leyouyou 2002-09-13
  • 打赏
  • 举报
回复
up
glhorse 2002-09-13
  • 打赏
  • 举报
回复
这个应该是正常的
sjzxyg 2002-09-13
  • 打赏
  • 举报
回复
“这个程序以4k的增量增加”
什么意思,没明白
ccnuxjg 2002-09-13
  • 打赏
  • 举报
回复
为什么自己不设置断点调试呢!?再看看listen,create,accept等函数是否成功调用了,你的close()函数执行了没有,程序阻塞了没有...
那不就什么都清楚了。


将nsock放到外面定义,可以增加效率。你用while(1),如果不开多线程,那你的程序岂不是象死机了一样:)


任务管理器里看到这个程序以4k的增量增加--不知你是不是说用掉的内存在增加。
liuyup 2002-09-13
  • 打赏
  • 举报
回复
gz
yixin22 2002-09-13
  • 打赏
  • 举报
回复
你有没有想过,用相反的立场看这个问题

你可以在客户端建立套接字,

bind 和listen有客户端来完成,把以前客户端请求连接服务器的条件加到服务器

上去,让服务器来判断连接条件,这样的话,服务器就不会一直在等待监听了,将

资源消耗到客户端上面,服务器端判断自身的条件,当要对客户端进行操作的话,

在connect客户端就可以了。这个只是我的想法,不一定在你的程序里能用上,仅

供你参考。我自己编的一个程序就是这么编的:)
richardxulf 2002-09-13
  • 打赏
  • 举报
回复
但是,这个程序应该不会调用到listen_socket的析够函数。如果永远不调用那么,内存不是一直要增加下去吗?其他人难道不是这么写的吗?
paul2002 2002-09-13
  • 打赏
  • 举报
回复
可能listen_socket每次调用Accept时,会分配一些内部对象使用,而且直到listen_socket对象析构的时候才释放掉,你看看CAsyncSocket::Accept的原码.
coolc 2002-09-12
  • 打赏
  • 举报
回复
up

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧