公司一个需求要socekt的监听端口可配置
于是我做了个方法在配置文件变化后把原来的socekt断掉再重新开始绑定监听
调试时报了这样的错误:
参考:一个封锁操作被对 WSACancelBlockingCall 的调用中断
对应的英文错误信息:"A blocking operation was interrupted by a call to WSACancelBlockingCall."
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:
估计是哪个地方的资源没有释放,将
NetworkStream netStream = new NetworkStream(clientSocket);
放到using中试试
@dudu:
@baoj2010:
我觉得问题可能在这个地方:
serverSocket.Close(); //... ListenStart();
在调用ListenStart();的时候,可能 serverSocket.Close(); 还没完成,应该在Close的相应事件中调用ListenStart();
@dudu: 发现这是在serverSocket.close()后就会出错
@dudu: 没有相关事件啊
@baoj2010: 参考:stopping connections
@dudu: 上面说直接忽略这个错误,不会影响重新后面的
@dudu: 但问题是我用了文件监视对象来动态修改端口,遇到这个异常后,监视对象不起作用了
@baoj2010: 捕获这个异常呢
@dudu: try{}catch{}catch不处理东西结果在serverSocket.close()后程序就退出了,调试都停了
@baoj2010: 问题还是出在close部分的代码,没有彻底close掉。
@dudu: 我明白了,所谓监视不起作用的原因是上次的文件更改触发的事件还没执行完被阻塞在那里了
@dudu: 之所以会出异常是因为那个while循环是在主线程打开,在这个循环没有跳出就用新建的线程去操作SeverSocket,那肯定会出错,只要在操作SeverSocket前让while自动退出就可以了
@baoj2010: 嗯,学习了