社区
网络编程
帖子详情
关于SOCKET一个代理服务器内存泄露问题。请高手指教
betterwxf3131
2007-08-09 09:11:36
我写了个基于SOCKET的代理服务器。我的模式是为每一个收到的SOCKET连接创建一个线程。在我的接受函数中。我又会创建一个子线程,为的是接受函数时超时返回,可我发现这样的话我的内存存在泄露。是不是线程函数创建太多了。哪位高手能帮我改改吗。怎么可以不用创建线程序也能实现接受。发送超时。帮小弟出出主意拉。急!谢谢了!欢迎高手讨论
...全文
296
9
打赏
收藏
关于SOCKET一个代理服务器内存泄露问题。请高手指教
我写了个基于SOCKET的代理服务器。我的模式是为每一个收到的SOCKET连接创建一个线程。在我的接受函数中。我又会创建一个子线程,为的是接受函数时超时返回,可我发现这样的话我的内存存在泄露。是不是线程函数创建太多了。哪位高手能帮我改改吗。怎么可以不用创建线程序也能实现接受。发送超时。帮小弟出出主意拉。急!谢谢了!欢迎高手讨论
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gister
2007-08-09
打赏
举报
回复
楼主说得有点不清楚,把代码贴出来看看
zdleek
2007-08-09
打赏
举报
回复
内存泄露可以用bonuscheck检查,如果你自己没有主意的话
不过自己的程序,通常自己仔细查找是可以发现的
僵哥
2007-08-09
打赏
举报
回复
代理服务器如果为自己的每一个连接都创建一个线程甚至更多线程的话,那么这个代理服务器能承载多少个用户?一个进程又能够创建得起来多少个线程,而这些线程又有多少个同时工作的?
对于内存泄露,这个只能靠自己或者工具去查。
easyrock
2007-08-09
打赏
举报
回复
[accept]
--[起新线程]
----[握手]
----[连目标地址]
----[循环]
------[select(客户端点,目标端点)]
------[如果(客户端点)有数据]
--------客户端点->目标端点
------[如果(目标端点)有数据]
--------目标端点->客户端点
easyrock
2007-08-09
打赏
举报
回复
为什么要每个连接要耗费两个线程??最多一个就够了.
[accept]
[起新线程]
[握手]
[连目标地址]
[循环]
[select(客户端点,目标端点)]
[如果(客户端点)有数据]
客户端点->目标端点
[如果(目标端点)有数据]
目标端点->客户端点
betterwxf3131
2007-08-09
打赏
举报
回复
还是感觉很迷茫。我的程序运行几天后会出现10055错误。也就是缓冲区不足
netcreator
2007-08-09
打赏
举报
回复
思路没问题
应该是这样弄
只是建议在accept后返回的新socket你要管理起来(在数量未知情况下通常我用链表管理),在有事件返回时在消息处理函数中处理返回的事件,接收相应的socket接受的数据则建议在消息处理函数中进行,而处理这些数据可由子线程完成,这是用的mfc的异步模式
如果想纯粹地用子线程处理所有事件,则就无法用消息处理机制,可以用select在子线程中去处理相应的socket,包括销毁该socket都可以(系统并不会释放相应的空间)不过,这样释放不干净,好像并没有什么好的办法,因为你也close了,也set null了,系统不释放是系统底层socket的工作机制,伯克利就是这样做的,应该也有它的道理。除非你自己写一个socket来处理,否则你就只能调用这些东东了。好在,一个socket句柄占用的空间并不多,占空间最多的是接受数据后new出的空间,那个记得释放就好了。在底层socket会管理得比较好,最后侦听的母socket记得销毁就好了
Avoid
2007-08-09
打赏
举报
回复
一般来说是lz没有关闭SOCKET造成的。
betterwxf3131
2007-08-09
打赏
举报
回复
我仔细的看下了程序。发现有个地方不是很明白,可能会出现问题
DWORD CALLBACK CWSocket::ServerProc(LPVOID lpParm)
{
SERVERPARA *para = (SERVERPARA*)lpParm;
if(para == NULL) return -1;
SOCKET s = para->s;
int port = para->port;
DEALPROC lpDealFunc = para->lpDealFunc;
delete para;
SOCKET sClient;
int iAddrSize;
struct sockaddr_in addr;
char IP[32];
HANDLE hThread;
DWORD dwThreadId;
DEALPARA *parac;
iAddrSize = sizeof(addr);
while(1)
{
sClient = accept(s, (struct sockaddr *)&addr, &iAddrSize);
if(sClient == SOCKET_ERROR) break;
sprintf(IP, "%d.%d.%d.%d", addr.sin_addr.S_un.S_un_b.s_b1,
addr.sin_addr.S_un.S_un_b.s_b2,
addr.sin_addr.S_un.S_un_b.s_b3,
addr.sin_addr.S_un.S_un_b.s_b4);
parac = new DEALPARA;
memset(parac->IP, 0, sizeof(parac->IP));
parac->s = sClient;
parac->port = port;
parac->lpDealFunc = lpDealFunc;
memcpy(parac->IP, IP, strlen(IP));
//侦听到连接,开一个线程
hThread = CreateThread(NULL, 0, DealProc, (LPVOID)(parac), 0, &dwThreadId);
if(hThread == NULL) delete parac;
}
return 0;
}
在这里有人说sClient会泄漏资源。最好写成sClient = accept(s, (struct sockaddr *)&addr, &iAddrSize);大家怎么看?
在SOCKET中有个这样的函数
CWSocket::operator=(SOCKET s)
{
if(IsSockConnected(s))
{
m_sSocket = s;
m_bConnected = TRUE;
m_bNeedClose = FALSE;
}
}
BOOL CWSocket::IsSockConnected(SOCKET s)
{
int nRet = 0;
struct fd_set Fd_Recv;
struct timeval Time_Recv;
memset(&Fd_Recv, 0, sizeof(struct fd_set));
FD_CLR(s, &Fd_Recv);
FD_SET(s, &Fd_Recv);
Time_Recv.tv_sec = 0;
Time_Recv.tv_usec = 0;
nRet = select(s, &Fd_Recv, NULL, NULL, &Time_Recv);
return (nRet == 0);
}
当parac->s = sClient会触发这个函数。我后来觉得IsSockConnected可调可不调用。就改成了
CWSocket::operator=(SOCKET s)
{
m_sSocket = s;
m_bConnected = TRUE;
m_bNeedClose = FALSE;
}
会不会有影响呢。。。。。。。。2个疑问 。各位高手给个答案吧。
_tcp_iocp_vc6.rar
_tcp_iocp_vc6 帮看看错误,求
指教
关于内存泄漏的一场讨论
比如说你写了一段很庞大的代码,并且代码里面,只有new,而没有任何
一个
delete,那么,即便你的每
一个
new出来的指针都保存得很好,也是存在着严重的
内存泄露
问题
。但总是把一些简单的
问题
复杂化了,内存泄漏主要影响的是程序本身运行的效率,是程序本身运行过程中内存管理不当的结果,os管理的是程序需要的资源,不该干预程序本身的资源管理,因此这个
问题
完全没必要从os的角度来看资源的管理。win下还有使用的资源也是需要维护的,如,dll加载到内核空间,要是狂加不放,你的app会把服务器给搞死的。大概也是这个道理吧。
SOCKET
自动被关闭是什么原因
我写了
一个
服务器程序。同事写了
一个
下位机。但他用两台下位机去连接我时前面的一台会被关闭。
问题
是出现在下位机。他写了
一个
线程当按F2时执行
我感觉他这样写有
问题
SOCKET
是全局的会不会下一台机器建立了
一个
相同的
SOCKET
所以前面的就就掉了
喜欢c和c++,或者汇编,或者喜欢windows sdk,或者喜欢算法的 朋友
并且最后一点,也是最重要的一点:有良好的 言行的 家伙
32*32点阵是个学问,我深的画icon精髓,有没有伯乐给我推荐一
socket
抛砖引玉
为什么要讲
socket
呢? 其实也没什么特别的原因,主要是自己想了解一下网络通信这块的东西,然后一直觉得
socket
高深难懂,所以决定挑战一下自己,做
一个
简单的学习了解。 以前因为项目原因接触过
socket
,但是当时是使用的
socket
.io的这个框架,对于
socket
的底层是如何实现的,以及框架是如何封装的并没有进行深入的研究。 所以这次就抛砖引玉简单的讲一下我对
socket
的理解,非常欢迎各位...
关于用DELPHI开发服务器软件中的一些经验
保存 评价 游戏规则 免费注册 资料下载 关于本站
问题
分类 编程
问题
非技术题 富翁列表 我的信息 提出
问题
在线富翁 富翁日历 笔记列表 我的笔记 写作笔记 全文检索 《专家门诊》 ALM大赛-->/delphibbs/dispq.asplid=2342105 富翁名称 富翁密码
请
记住我 富翁名称 免费注册
网络编程
18,357
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章