日期:2014-05-18  浏览次数:20991 次

奇怪的tcpclient错误.头大死了。在线等


我用tcpclient做了个登陆 公司邮件服务器的程序(如上图)。
点击connect 按钮后连接,然后调用close释放连接 后退出。

我本机有2个IP,需要指定一个IP(192.168.1.101)发送。

采用如下代码bind绑定到本地。
 IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 25);
 myServer = new TcpClient();
 myServer.Client.Bind(ipPoint); 


奇怪的事情发生了,当代码执行完一遍后,马上再按连接按钮,
出现 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 的异常提示。
如果中间停止1-2分钟再点击连接,就不会出现这个问题。
查了很多资料。说是连接还没来得及放掉,要等。

但是如果把 myServer.Client.Bind(ipPoint); 即绑定这句去掉,
就不需要等待。好像close一执行就把所有资源放掉了。

但是我们必须在使用tcpclient时指定本地IP,怎样可以避免那个异常?

以下为代码部分。

 IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 25);
  TcpClient myServer = null;
  NetworkStream myNetStrm = null;
  StreamReader myRdStrm = null;

  try
  {
   
  myServer = new TcpClient();
  myServer.Client.Bind(ipPoint); 
  myServer.Connect("220.181.12.66", 25);

   

  myNetStrm = myServer.GetStream();
  myRdStrm = new StreamReader(myServer.GetStream());
  textBox1.AppendText(myRdStrm.ReadLine()+"\r\n") ;

  }
  catch (Exception ex)
  {
  textBox1.Text = ex.Message ;
   
  }
  finally
  {

  if (myNetStrm != null) { myNetStrm.Close(); myNetStrm = null; }
  if (myServer != null) { myServer.Close(); myServer = null; }

  }


------解决方案--------------------
监听服务是进程级的,如果弄成界面上“一会儿监听、一会儿close、一会儿又监听”,那就成了网上的一些培训“教师”写的根本不是产品中使用的demo代码的。