原代码如下:
//开始监听
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(); //停止监听时此处会出错此处会出错,请问如何解决
//开始监听
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(); //停止监听时此处会出错此处会出错,请问如何解决
解决方案 »
- C#Winform SqlServer导入导出Excel 问题
- winform中datagrid 如何转换excel
- 使用ReSharper 2.5后我的自定义编辑器颜色被改变了,如何修复?
- DesignSurface问题
- 小问题,进来看看!
- 有没有办法在。net下编译出来的EXE,可以当.net的类库来用!
- 如何去掉当前网页中IE的菜单和工具栏等,谢谢!
- 【.net的大侠们,是否.net也有类似java的Hibernate样的东西?】
- 在C#中如何对剪切板进行操作?
- C#调用Delphi写的dll的问题。
- 求助 .net2005中GridView怎样实现tab顺(就是按tab键使GridView中单元格顺序获得焦点)
- 设置了datagridviewrow.errortext,却看不见行前面的惊叹号!
1、你使用的是2.0以下的.net,所以在工作线程中操作UI线程的(RichTextBox)m_richTextBox编译没有报错。
2、你在UI线程里通过一个button控制ListenerFlag变量,然后再运行open方法进行开始停止。
呵呵,以上是推测,我估计的问题出在:
if (newSocket != null)
{
if (newSocket.Connected) //.Connected反映最近操作时的连接状态
{
newSocket.Shutdown(SocketShutdown.Both);
}
newSocket.Close();
}
在SDK里,这样说明:
Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
所以,估计你的代码返回的是false,所以没有Shutdown直接Close了,引发了下边while里边的异常。
推测而已,你可以看看是不是if里边的语句没有执行!
....
while(true)
{
try
{
tcpClient = server.AcceptTcpClient();
NetworkStream ns = tcpClient.GetStream();
.....
接收信息
做自己需要做的事
ns.Close();
tcpClient.Close();
}
catch(Exception ex)
{
if (null != ns)
{
ns.Close();
}
if (null != tcpClient)
{
tcpClient.Close();
}
Console.WriteLine(ex.Message + " AcceptTcpClient error \r\n" + ex.StackTrace);
}