mmz-asio4delphi死链接的解决办法
最近一段时间,因为忙于网络的项目,特意到网上找了些例子,特意花时间研究了一下马敏钊写的 mmz-asio4delphi 感觉很好用,不过深入研究之后,发现一个问题。
马大的这个代码,会产生死链接。
try
if TAsioClient(FClientLst.Objects[i]).Socketptr > 0 then begin
Asio_closesocket(TAsioClient(FClientLst.Objects[i]).Socketptr);
TAsioClient(FClientLst.Objects[i]).Socketptr := 0;
end;
//Asio_DisConnedCallback(integer(TAsioClient(FClientLst.Objects[i])));
except
end;
这是TAsioSvr.CheckDeadClients中的一段代码,可能跟原版的有点区别,不过大体在这。可以看到,上面的代码中,如果socketptr不为0则调用asio_closesocket函数关闭,
然后直接给Socketptr赋值为0。但运行后发现,虽然程序中socketptr已经赋值为0,并且对应的客户端也已经删除,但在Windows中,该链接还是存在,当初占用的端口依旧被占用。
在程序中的体现就是:显示AsioSvr.FClientLst.Count 和 AsioSvr.FDeadClients.Count 的数量,要远远小于,从360看到的该程序占用链接的数量,说明其中很多死链接存在。
以下是asio_closesocket的C++代码:
DllExport int Asio_closesocket(session * isocket)
{
//isocket->userdata=0;//不允许再触发
try
{
isocket->deadtime=GetTickCount();
isocket->socket().cancel();
boost::system::error_code ignored_ec;
isocket->socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec);
isocket->socket().close(); }
catch(...)
{}
//EnterCriticalSection(&criCounter);
//deadlist.push_back(isocket);
//LeaveCriticalSection(&criCounter); //delete isocket;
return ;
}
因为不怎么懂C++,所以不知道该怎么改。那怎么解决死链接杀不掉的问题呢?
有的大大说,只要把Delphi代码中注释的那句Asio_DisConnedCallback(integer(TAsioClient(FClientLst.Objects[i]))); 去掉注释就可以。
其实只要看看Asio_DisConnedCallback的执行代码就知道,问题依然存在。甚至是Delphi中,将对应的客户端对象释放,对应的socket链接还是没有断开。
后来看C++代码的时候,发现了下面这个函数:
DllExport int Asio_Client_Free(session * isocket)
{
delete isocket;
return ;
}
可以删除socket对象!这实在是太棒了,正是我想要的。
可是,应用中才发现,这个函数带来了另外一个问题。删除自身的socket链接的同时,居然将监控端口的socket也删除了!
无奈,只能另找办法。功夫不负有心人,无意中发现,原来可以用write函数来达到删除socket的目的。
void handle_write(const boost::system::error_code& error,int iuser,int iuser2)
{
if(Callback_writedata!=NULL)
{
// std::cout << "write ok " << iuser << "\n" ;
Callback_writedata(iuser,iuser2);
}
if (!error)
{ }
else
{
socket_.close();
if(Callback_DisConn!=NULL)
{
Callback_DisConn(userdata);
} delete this;
}
}
从上面的代码可以看到,如果write出错,函数会disconn的回调函数,并且"delete this"。终于可以解决问题了啊。
try
if TAsioClient(FClientLst.Objects[i]).Socketptr > then begin
TAsioClient(FClientLst.Objects[i]).Write(@bytes[],);
except
end;
只要在一段时间没数据收发以后,随便给这个客户端发点东西,如果发送错误,自动会断开链接。
mmz-asio4delphi死链接的解决办法的更多相关文章
- discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法
discuz x3在DIY模块中调用伪静态不成功,显示动态链接,然而其他的链接正常显示伪静态. 后台启用伪静态后,发现论坛版块.帖子点击链接,伪静态正常显示,然后在门户首页DIY显示的帖子,点进去后发 ...
- CuteFTP文件列表按名称排序,有中文文件名时,软件死掉的解决办法
看到很多人的解决办法是切换到一个没有中文的文件夹,点击排序后,再切换回来,这个的确是可以解决问题,但是有些繁琐! 直接一步到位的解决办法是: 依次点击菜单:工具->全局选项->导航-> ...
- root用户ssh可以登录,xftp通过sftp不能登录链接CentOS解决办法
xftp显示无法连接到xx.xx.xx(服务器地址) 解决办法: 把/etc/ssh/sshd_config文件中的Subsystem sftp /usr/libexec/openssh/sftp-s ...
- 微信内无法自动跳转外部浏览器打开H5分享链接的解决办法
很多情况下我们用微信分享转发H5链接的时候,都无法在微信内打开,即使开始能打开,过一段时间就会被拦截,拦截后再打开微信会提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢,主要有以下四点 1 ...
- (转)ecshop刷新页面出现power by ecshop和链接的解决办法
当小伙伴在使用echop模板进行修改的时候,如果你删掉底部自带版权后,再调试程序刷新界面的时候,时不时就会冒出一个power by ecshop,而且是带有链接的,很不舒服,所以需要去掉,下面是最简单 ...
- ecshop刷新页面出现power by ecshop和链接的解决办法
当小伙伴在使用echop模板进行修改的时候,如果你删掉底部自带版权后,再调试程序刷新界面的时候,时不时就会冒出一个power by ecshop,而且是带有链接的,很不舒服,所以需要去掉,下面是最简单 ...
- delphi假死线程堵塞解决办法
Delphi的高效不多说... 俗话说:真正的程序员用C语言,聪明的程序员用Delphi,一点都不假,和C++比它比C++更简单,更容易上手,功能丝毫不逊色C++,比起VB,毫无疑问比VB好多了,重要 ...
- DedeCMS使用channelartlist循环,不能获取外部链接的解决办法
Dede在制作下拉菜单时,可以使用channelartlist循环调用顶级栏目和子栏目,但该标签不能获取外部链接, 下拉菜单时一段代码搞定多个顶级栏目和子级栏目的同时输出. <div> ...
- 腾讯云服务器ssh登录老是自动断开链接的解决办法
vim /etc/ssh/sshd_config 找到下面两行 #ClientAliveInterval 0 #ClientAliveCountMax 3 去掉注释,改成 ClientAliveInt ...
随机推荐
- MyBatis增、删、改、查
1.config.xml文件的基本配置信息 2.选择数据源 3.mybatis约定 (1)parameterType和resultType 只能传一个参数,但是我们可以传一个数组或者集合,达到传多个参 ...
- child_process 子进程
创建子进程,使其可以在进程中执行操作,应用系统命令等.nodejs创建子进程有四种方法,分别是spawn,fork,exec,execFile. 区别 : 格式 : spawn和execFile的格式 ...
- 《两地书》--Kubernetes(K8s)基础知识(docker容器技术)
大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相 ...
- javascript深入理解js闭包(转载)
此篇文章来源于http://www.jb51.net/article/24101.htm 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全 ...
- JVM(2)--一文读懂垃圾回收
与其他语言相比,例如c/c++,我们都知道,java虚拟机对于程序中产生的垃圾,虚拟机是会自动帮我们进行清除管理的,而像c/c++这些语言平台则需要程序员自己手动对内存进行释放.虽然这种自动帮我们回收 ...
- 大众美团服务链监控CAT
github链接:https://github.com/dianping/cat CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户 ...
- 【Java资源免费分享,网盘自己拿】
JavaSE: Java马士兵:链接:https://pan.baidu.com/s/1jJRvxGi密码:v3xb Java毕向东:链接:https://pan.baidu.com/s/1ggzHk ...
- [十七]基础类型BigDecimal简介
BigDecimal是不可变的.任意精度的.有符号的.十进制数. 组成部分 BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成 BigDecimal ...
- Linux基础命令第三天
1,vim编辑器 命令模式下: pageup 往上翻页 pagedown 往下翻页 H 光标移动到屏幕首行 gg 光标动荡到文档的首行,如果前面加上n,表示移动到n行 G 移动文档最后一行 /name ...
- SpringBoot系列——i18n国际化
前言 国际化是项目中不可或缺的功能,本文将实现springboot + thymeleaf的HTML页面.js代码.java代码国际化过程记录下来. 代码编写 工程结构 每个文件里面的值(按工程结构循 ...