异步Socket在关闭以后出错。   
  try{}catch{}捕获不了Socket.Close()异常,感觉因该是程序卸载内存时候出的错。   
  以下是异常内容:   
  未处理的“System.InvalidOperationException”类型的异常出现在   system.dll   中。   
  其他信息:   AcceptCallback   
  多谢! 

解决方案 »

  1.   

    先调用Shutdown()试试。备注
    Close 方法可关闭远程主机连接,并释放所有与 Socket 关联的托管资源和非托管资源。关闭后,Connected 属性将设置为 false。对于面向连接的协议,建议先调用 Shutdown,然后再调用 Close 方法。这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。如果需要在不首先调用 Shutdown 的情况下调用 Close,则可以将 DontLinger Socket 选项设置为 false,并且指定一个非零的超时间隔,从而可以确保排队等待输出的数据得到发送。这样,Close 将会一直阻塞到发送完该数据或指定的时限超时为止。如果将 DontLinger 设置为 false,并且指定了一个非零的超时间隔,Close 将会释放连接并自动放弃排队等待输出的数据。注意   若要将 DontLinger 套接字选项设置为 false,需创建 LingerOption,将启用的属性设置为 false,并将 LingerTime 属性设置为所需的超时时长。将该 LingerOption 和 DontLinger 套接字选项一起使用,可调用 SetSocketOption 方法。
      

  2.   

    在AcceptCallBack里面捕获异常并处理。Close()本身不会引发什么异常,但它有可能会导致AcceptCallBack、ReceiveCallBack、SendCallBack引发异常。因为Close()会导致Accept、Receive、Send返回,它们的回调函数被执行。但此时Socket已经被释放,故而引发异常。所以只要在回调函数里判断一下Socket的状态并捕获异常就可以了。
    用Shutdown可以防止这种现像的发生并保证数据的完整性,但也会导致Socket不能立即关闭。所以用不用要看你的需求。
      

  3.   

    我已经加了Shutdown()了的,但是还是会出现那个异常,客户端是用C写的,每次请求了数据后,就断开连接,再要请求数据的时候,再连接,也不是总会出现那个异常,不定时间的出现,我看了以前的兄弟又问道,最后那位兄弟似乎解决了
    ---------------------------
    5 楼lhj0532(klinsmann)回复于 2006-03-02 15:29:58 得分 0 知道答案了。   
      Accept之前一定要先Poll无论是同步还是异步,看看有没有请求的连接,如果有就Accept。如果没有Poll则Socket服务会一直阻塞监听,如果这时Close,就会抛出异常。   
      MSDN的实例几乎没有Socket服务的Close,所以没有用到Poll这个方法。   
      谢谢楼上的兄弟们了!
    ----------------------------------
    但是我没有看懂他的解决办法
      

  4.   

    我也在做socket的项目,先帮你顶上去
      

  5.   

    经验: 有时候对方断开连接 . 只是收到空. byte 全0
      

  6.   

    我是楼主,我是要做个刷卡系统,客户端每链接一次服务端,请求数据或者是发送数据,完成后,就会关闭SOCKET,这个过程大约也就3秒钟的时间,在测试的时候,也就是每3秒就会建一次链接,处理一次数据,并关闭链接,还有,是多客户端的