当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 改善C#中socket通信机客户端程序的健壮性

ASP.NET
C#中使Datawindow.Net组件处理数据
在.net开发中几个重要的认识误区(1)
WML教程11:文本框控件(Input)
WML教程6:动作和链接
在WEB自定义控件中实现事件及自动保存值
WML教程14:WML 文本处理
表单启动太慢时显示一个等待图标(类似Windows下的时间沙漏)
ADO.NET学习笔记(二)
使用HttpContext中的User属性来实现用户身份验证之用户验证票篇
由DataGrid翻页所导致的诸多问题的解决方案
动态加载类的原理:元数据的使用
用C#实现Des加密和解密
快速对图片进行滤光处理
可以代替窗体Refresh方法的函数
『原创』适合初学的简单3D碰撞检测初探(对于3D编程初学人员)
《Essential .Net》读书笔记 - Chapter 3
Lion.Web.WebHtmlEditor 1.0 Hack 攻略
数据库事务处理的另外一种方法
[WSE]Web Service—后台侦听服务通过WSE2.0建立订阅/发布关系
给windows服务添加描述

ASP.NET 中的 改善C#中socket通信机客户端程序的健壮性


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 236 ::
收藏到网摘: n/a

    我是做Socket的新手,最近做了一个Socket客户端程序,连接Server的时候,如果server存在,并且允许连接的话,程序无错,正常执行;但是如果Server不存在,或者拒绝连接,程序就会卡住,此时不提示出错。开始我以为是没有Catch异常,但是检查了程序,异常情况都Catch掉了,程序还是卡。

请各位大虾帮忙指正!谢谢,以下是我这个模块的代码!

using System;
using System.Collections;
using System.ComponentModel;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;


namespace 测试程序
{
 /// <summary>
 /// ClassClient 的摘要说明。
 /// </summary>
 public class ClassClient
 {
  //方法
  public ClassClient()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  //函数

  #region socket通信机连接函数
  /// <summary>
  /// socket通信机连接函数
  /// </summary>
  /// <param name="remoteEP">远程终端</param>
  /// <param name="client">建立客户端</param>
  public  byte SocketConnect(EndPoint RemoteEP, Socket Client)
  {
   //调用系统连接函数
   Client.BeginConnect(RemoteEP,new AsyncCallback(ConnectCallback), Client );
           
   ConnectDone.WaitOne();
   
   return(1);

   
  }
  #endregion

  #region socket连接返回函数
  /// <summary>
  /// socket连接返回函数
  /// </summary>
  /// <param name="ar">表示异步操作的状态</param>
  private static void ConnectCallback(IAsyncResult ar)
  {
   try
   {
    // 获取socket连接实例
    Socket client = (Socket) ar.AsyncState;

    // 完成连接过程.
    client.EndConnect(ar);

    // 置位连接完成标志
    ConnectDone.Set();
    
    // 得到连接成功信息
    ConnectInfo="连接成功!";
   }
   catch (Exception e)
   {
    // 得到连接失败信息
    ConnectInfo=e.ToString ();

    // 结束连接
    ConnectDone.Reset ();
   }
  }
  #endregion

  #region socket通信机关闭函数
  /// <summary>
  /// socket通信机关闭函数
  /// </summary>
  /// <param name="Client">需关闭的socket通信实例</param>
  public byte SocketClose(Socket Client)
  {
   try
   {
    if (Client!=null)
    {
     //如果仍然产生通信信息,则禁用
     if (Client.Connected) 
     {
      Client.Shutdown(SocketShutdown.Both);
     }
     //关闭socket通信
     Client.Close();

     //获得关闭成功信息
     CloseInfo = "通信机已关闭!";
    }
    return(1);
   }
   catch (Exception e)
   {
    //获得关闭通信失败信息
    CloseInfo = e.ToString();

    return(0);
   }