如何自动关闭一个socket? (200分)

  • 主题发起人 主题发起人 netspur
  • 开始时间 开始时间
N

netspur

Unregistered / Unconfirmed
GUEST, unregistred user!
我想让程序在一个socket出错的时候自动关闭这个socket,但是我尝试在onerror事件中关闭,
结果失败,请问有什么方法吗?谢谢。
 
对不起,我问错问题了。应该是:

我的程序首先initializecriticalsection(cs1),然后在socket的onerror事件里执行
deletecriticalsection(cs1),但是运行的时候提示出错:
Access violation at address BFF8AF1F
in module 'KERNEL32.DLL'.Write of address BFF7A10E.

请问是怎么回事,如何解决?
 
贴出源码看看
 
自己里面不能消掉自己吧?
 
自己里面是不能关闭自己,tclientsocket和tserversocket也一样的!
 
可以推迟释放

定义DelSockMsg
DelSockMsg=USerMsg+3

考虑在Socket.OnError事件中加入:
self.Disconnect;
DelSockMsg.lparam:=self;
postmessage(主窗口句柄,DelSockMsg);

然后在主窗口中增加事件过程:
DelSockMsgProc(var Msg)
begin
Tclientsocket(DelSockMsg.lparam).free;
end
 
直接 Free;
 
问题出在你关闭Socket是在你OnError中进行,而OmnError是由Socket调用的,OnError调用完成后,还要还回Socket继续,你将它释放了,返回后Socket已被释放,自然会出错,你访问了被释放的内存空间。

只是通过异步方式处理,如同zuping。
 
后退
顶部