Socket 出错提示(WSACancelBlockingCall 的调用中断)如何解决
原代码如下:
//开始监听
public bool Open()
{
string strTemp = "";
int length = 0;
byte[] tmpByte;
string strFrame = "";
string meterNo = "";
if (ListenerFlag)
{
MyServer = new IPEndPoint(this.IP, this.Port);
socketForClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketForClient.Bind(MyServer);
socketForClient.Listen(50); //50为可连接的链接数
((RichTextBox)m_richTextBox).AppendText("开始侦听:" + DateTime.Now.ToString() + "\r\n");
}
else
{
try
{
((RichTextBox)m_richTextBox).Text += "停止侦听" + "\r\n";
if (newSocket != null)
{
if (newSocket.Connected)
{
newSocket.Shutdown(SocketShutdown.Both);
}
newSocket.Close();
}
if (socketForClient != null)
{
socketForClient.Close();
}
GC.Collect();
}
catch (Exception ex)
{
MessageBox.Show("停止侦听---" + ex.ToString());
}
return false;
}
while (ListenerFlag)
{
//返回可以用以处理连接的Socket实例
if (socketForClient!=null)
newSocket = socketForClient.Accept(); //停止监听时此处会出错
remoEP = (IPEndPoint)newSocket.RemoteEndPoint;
newSocket.Blocking = true; //阻塞方式
if (newSocket.Connected)
{
////newSocket.ReceiveTimeout = 10000;
((RichTextBox)m_richTextBox).Text += DateTime.Now.ToString() + ":" + "与客户端 " + remoEP.Address.ToString() + " 建立了连接" + "\r\n";
//接受数据
while (true)
{
tmpByte = new byte[DEALLEN];
//temp = AcceptBytes();
strTemp = "";
length = newSocket.Receive(tmpByte, tmpByte.Length, 0);
for (int i = 0; i < length; i++)
{
strTemp += tmpByte[i].ToString("X2") + " ";
}
////strTemp = Encoding.BigEndianUnicode.GetString(tmpByte);
strTemp += " " + DateTime.Now.ToString();
//length = AcceptBytes();
//接收心跳帧
if (length == 18)
{
meterNo = "";
((RichTextBox)m_richTextBox).Text += "心跳数据:" + strTemp + "\r\n";
//SendBytes("680C0C6841160000350608000E411000F916");
strFrame = "680C0C6841160000350608000E411000F916";
((RichTextBox)m_richTextBox).Text += "心跳应答:" + strFrame + " " + DateTime.Now.ToString() + "\r\n";
if (!loginFlag)
{
((RichTextBox)m_richTextBox).Text += "终端:" + meterNo + "---上线" + "\r\n";
loginFlag = true;
}
SendBytes(strFrame);
////tmpByte = Algol.GetHexBytes(strFrame);
////socketForClient.Send(tmpByte, tmpByte.Length, 0);
}
else if (length > 0)
{
((RichTextBox)m_richTextBox).Text += strTemp + "\r\n";
}
//客户端断开时,length为0
if (length == 0)
{
((RichTextBox)m_richTextBox).Text += "客户端已断开连接,重新开始侦听" + "\r\n";
if (newSocket != null)
{
newSocket.Shutdown(SocketShutdown.Both);
newSocket.Close();
}
break;
}
}
}
}
return true;
}
执行停止监听时
if (socketForClient!=null)
newSocket = socketForClient.Accept(); //停止监听时此处会出错
此处会出错,请问如何解决