Q:
端口转接器的问题1:
网元:ERICSSONOSS 接收数据时发生异常
System.Net.Sockets.SocketException: 一个封锁操作被对 WSACancelBlockingCall 的调用中断。
在 System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
在 System.Net.Sockets.Socket.Send(Byte[] buffer)
在 Ultr.ActiveMonitor.SocketConvernationLib.NeVirtualPortTelnetSession.EndReceiveNeSocket(IAsyncResult ir)
有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
端口转接器的问题2:
System.ObjectDisposedException: 无法访问已释放的对象。
对象名:“System.Net.Sockets.Socket”。
在 System.Net.Sockets.Socket.Shutdown(SocketShutdown how)
在 Ultr.ActiveMonitor.SocketConvernationLib.NeVirtualPortListener.SocketSession_Received(Object sender, DataReceivedEventArgs e)
A:
这个其实是在建立连接以后, 没有测试连接就直接使用, 有时候底层socket并没有完全准备好, 就会报告这个这个异常
.net的apidemo里面是这么写的
// .Connect throws an exception if unsuccessful client.Connect(anEndPoint); // This is how you can determine whether a socket is still connected. bool blockingState = client.Blocking; try { byte [] tmp = new byte[1]; client.Blocking = false; client.Send(tmp, 0, 0); Console.WriteLine("Connected!"); } catch (SocketException e) { // 10035 == WSAEWOULDBLOCK if (e.NativeErrorCode.Equals(10035)) Console.WriteLine("Still Connected, but the Send would block"); else { Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode); } } finally { client.Blocking = blockingState; }
Q:
如果在一个主线程内起了一个工作线程去连接网元, 在连接建立起来以后, 主线程调用工作线程的abort方法强制结束工作线程, 工作线程内部的Socket句柄会不会释放, 非托管会不会被释放(文件句柄, IO句柄,数据库连接)?
A:
不会,因为这些资源的句柄是存储在进程的句柄表的,所以在进程结束以前, 这些资源很难被释放掉(.net的自动回收机制理论上可以回收掉, 但是仅仅存在在理论上, 实际写服务器端代码的时候, 是无法依赖.net的自动回收的, 因为.net的自动回收的时机是不确定的, 很有可能在资源耗尽以后再开始进行回收 ,但是那个时候, 系统已经开始停止服务了, 这种情况是不允许出现的)
Q:
一个对象的事件有注册的事件响应函数,那么这个对象不再有用以后, 如果注册的事件响应函数没有取消注册,那么这个对象是不是可以被回收释放。
A:
不会,这个是由于事件本质上是使用函数指针来做的.