Serversocket问题/客户每次连接-断开一次,服务程序占用内存就增加4K,为什么?

Vtang 2006-12-20 04:53:29
客户每次连接-断开一次,服务程序占用内存就增加4K,为什么?
...全文
376 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbkopoky 2007-02-17
  • 打赏
  • 举报
回复
有一个香港和悦网络电话的源文件 ,有兴趣妨进入我的BLOG看看
shadowstar 2007-01-20
  • 打赏
  • 举报
回复
检查一下代码吧,这样的问题太笼统.
pp616 2007-01-18
  • 打赏
  • 举报
回复
没发现Serversocket有这个问题。资源使用很稳定。没有每连接一才就增加4K内存的现象。
do2008 2007-01-18
  • 打赏
  • 举报
回复
在BCB的安装目录下$(BCB),VCL中自带的Sockets.pas这个VCL源码文件中,TBaseSocket的Close方法有点问题;

路径: $(BCB)\Source\Internet\sockets.pas

procedure TBaseSocket.Close;
begin
if FActive then
begin

//这里,在有LINUX这个宏里,就会调用close(FSocket),去释放socket的资源

{$IFDEF LINUX}
ErrorCheck(Libc.__close(FSocket));
{$ENDIF}

FSocket := INVALID_SOCKET;
FActive := False;
DoDestroyHandle;
end;
end;

但windows没有,也就是说,TBaseSocket.Close;并没有真正去释放socket的资源
比如,用TcpView等工具,就可以看到服务进程占用的TCP端口,在客户端断开连接后,
还是处于listen状态,并没有释放这个端口

也就是说,有可能是这个原因造成服务程序不断占用4K内存的原因

建议将函数改为如下:

procedure TBaseSocket.Close;
{$IFDEF MSWINDOWS}
var
NonBlock: Integer;
{$ENDIF}
begin
if FActive then
begin

{$IFDEF MSWINDOWS}//添加对windows的处理
ErrorCheck(ioctlsocket(FSocket, FIONBIO, NonBlock));
{$ENDIF}

{$IFDEF LINUX}
ErrorCheck(Libc.__close(FSocket));
{$ENDIF}
FSocket := INVALID_SOCKET;
FActive := False;
DoDestroyHandle;
end;
end;


然后再这个$(BCB)\Source\Internet\sockets.pas文件复制到你的Project源码目录下,添加到你的Project中,再编译即可。
do2008 2007-01-18
  • 打赏
  • 举报
回复
1.单步跟踪服务程序TServerSocket的相关事件处理代码,排除自己代码出现问题的可能
2.开CodeGuard,看服务程序是否申请了某些资源, 却没有正确释放
wcpjavastudy 2007-01-10
  • 打赏
  • 举报
回复
邀请c/c++学习的各路好友加入c/c++学习群:17185131

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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