首页 新闻 会员 周边 捐助

socket在关闭后重新启起来报错

0
悬赏园豆:5 [已解决问题] 解决于 2014-02-20 17:18

公司一个需求要socekt的监听端口可配置

于是我做了个方法在配置文件变化后把原来的socekt断掉再重新开始绑定监听

调试时报了这样的错误:

 

baoj2010的主页 baoj2010 | 初学一级 | 园豆:102
提问于:2014-02-20 14:18
< >
分享
最佳答案
1

参考:一个封锁操作被对 WSACancelBlockingCall 的调用中断

对应的英文错误信息:"A blocking operation was interrupted by a call to WSACancelBlockingCall."

 
 
收获园豆:5
dudu | 高人七级 |园豆:29568 | 2014-02-20 14:52

private static void AcceptMessage()
{
         NetworkStream netStream = new NetworkStream(clientSocket);
         while (true)
        {
             try
               {
                    byte[] datasize = new byte[4];
                     if (netStream.DataAvailable)
                     {
                           netStream.Read(datasize, 0, 4);
                           int size = BitConverter.ToInt32(datasize, 0);
                           byte[] message = new byte[size];
                           int dataleft = size;
                           int start = 0;
                           while (dataleft > 0)
                           {
                                 int rev = netStream.Read(message, start, dataleft);
                                 dataleft -= rev;
                                 start += rev;
                            }
                            string msg = Encoding.Unicode.GetString(message);

                             if (msg.ToLower() ==                 GeneratorConfiguration.Current.Command.UpdateAnalyzer)
                             {
                                     Generator.UpdateAnalyzer();
                                      foreach (var item in GeneratorConfiguration.Current.SearchServerInfo.ServerList)
                                     {
                                            int port = Converter.ToInt32(item.ConnectPort, 18080);
                                            SendMessage(item.IP, port);
                                      }

                    }
                    else if (msg.ToLower() == GeneratorConfiguration.Current.Command.UpdateSynonym)
                     {
Generator.UpdateSynonym();
                     }
              }

      }
      catch
      {
           break;
      }
   }
}

我的代码里已经加了这个判断了

 

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 15:17

@baoj2010: 

估计是哪个地方的资源没有释放,将

NetworkStream netStream = new NetworkStream(clientSocket);

放到using中试试

dudu | 园豆:29568 (高人七级) | 2014-02-20 15:24

@dudu: 

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 15:30

@baoj2010: 

我觉得问题可能在这个地方:

serverSocket.Close();
//...
ListenStart();

在调用ListenStart();的时候,可能 serverSocket.Close(); 还没完成,应该在Close的相应事件中调用ListenStart();

dudu | 园豆:29568 (高人七级) | 2014-02-20 15:37

@dudu: 发现这是在serverSocket.close()后就会出错

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 15:37

@dudu: 没有相关事件啊

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 15:50

@baoj2010: 参考:stopping connections

dudu | 园豆:29568 (高人七级) | 2014-02-20 15:51

@dudu: 上面说直接忽略这个错误,不会影响重新后面的

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 16:24

@dudu: 但问题是我用了文件监视对象来动态修改端口,遇到这个异常后,监视对象不起作用了

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 16:34

@baoj2010: 捕获这个异常呢

dudu | 园豆:29568 (高人七级) | 2014-02-20 16:38

@dudu: try{}catch{}catch不处理东西结果在serverSocket.close()后程序就退出了,调试都停了

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 16:58

@baoj2010: 问题还是出在close部分的代码,没有彻底close掉。

dudu | 园豆:29568 (高人七级) | 2014-02-20 16:59

@dudu: 我明白了,所谓监视不起作用的原因是上次的文件更改触发的事件还没执行完被阻塞在那里了

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 17:08

@dudu: 之所以会出异常是因为那个while循环是在主线程打开,在这个循环没有跳出就用新建的线程去操作SeverSocket,那肯定会出错,只要在操作SeverSocket前让while自动退出就可以了

baoj2010 | 园豆:102 (初学一级) | 2014-02-20 17:13

@baoj2010: 嗯,学习了

dudu | 园豆:29568 (高人七级) | 2014-02-20 17:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册