写了一个socket服务端,捕获不到的异常

linchenrr 2008-07-14 04:31:17
写一个socket,传输数据一切正常.但是当一个客户端关闭窗口时,服务器端就出现了一个如下异常:

//----------------------------------------------------------------------------
在 System.Net.Sockets.SocketException 中第一次偶然出现的“System.dll”类型的异常
在 System.Net.Sockets.SocketException 中第一次偶然出现的“System.dll”类型的异常
线程 0xb48 已退出,返回值为 0 (0x0)。
线程 0xad4 已退出,返回值为 0 (0x0)。
程序“[3504] socket.vshost.exe: 托管”已退出,返回值为 0 (0x0)。
//----------------------------------------------------------------------------------

而且其它用户和服务器再通信后也会引发这个异常.请问如何解决.源码较长不好贴上来.
...全文
215 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
GabrielCNMao 2008-07-15
  • 打赏
  • 举报
回复
監聽移除了,但是每個Socket應該是一個線程吧,
監聽移除的同時,線程會跟著結束嗎?
linchenrr 2008-07-15
  • 打赏
  • 举报
回复
关键问题是监听根本就没有被移除啊,如果就这样结束线程,随着越来越多的人下线,无谓的监听资源占用量就会越来越多啊
linchenrr 2008-07-14
  • 打赏
  • 举报
回复
似乎还是不行啊...
bbbbbb888888 2008-07-14
  • 打赏
  • 举报
回复
this.disconnection_event -= se;
改成这个应该可以了.
linchenrr 2008-07-14
  • 打赏
  • 举报
回复
我的问题就是
this.msg_received += new SocketEvent(se);
这句确实成功添加了侦听

但是奇怪的是
this.msg_received -= new SocketEvent(se);
这句却怎么也没有移除侦听。 程序确确实实运行到这里了,我输出测试过的
linchenrr 2008-07-14
  • 打赏
  • 举报
回复
我使用观察者模式写的,主要的问题是捕获到异常之后执行移除侦听的动作,但是却发现侦听并没有被移除,很奇怪,那个方法确实被执行了。
这样就导致的问题是一个客户端退出之后其他任意一个客户端再向服务端发送消息的话也直接触发了客户端断线事件,很奇怪,全部都乱了。


//事件委托
public delegate void SocketEvent(MsgSocket ms);

//接收到消息事件
public event SocketEvent msg_received;


//客户端离线事件
public event SocketEvent disconnection_event;

//增加侦听的方法
public void addEventListener(String type, SocketEvent se)
{
switch (type)
{
case MsgEvent.MSG_RECEIVED:
this.msg_received += new SocketEvent(se);
//这边添加侦听成功,所以可以接收到其他对象发送的消息。
break;

case MsgEvent.DISCONNECTION:
this.disconnection_event += new SocketEvent(se);
break;

default:
break;
}
}
//移除侦听的方法
public void removeEventListener(String type, SocketEvent se)
{

switch (type)
{
case MsgEvent.MSG_RECEIVED:
this.msg_received -= new SocketEvent(se);
//这句确实被执行了,但是就是不移除侦听,仍然在接收其他对象,但是连接已经关闭,发生错误。
break;

case MsgEvent.DISCONNECTION:
this.disconnection_event -= new SocketEvent(se);
break;

default:
break;
}

}
bbbbbb888888 2008-07-14
  • 打赏
  • 举报
回复
你要捕捉2个异常:
//客户端意外断开的异常,和断开时,仍然在接受数据,但是Object已经Disposed
catch (SocketException ex)
{
if (10054 == ex.ErrorCode)
{
CloseClient();
}

}
catch (ObjectDisposedException ex)
{
if (ex != null)
{
ex = null;
}
}

110,825

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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