现象描述:当服务端没有开始监听,客户端直接“进行”连接,按理说这样肯定是会有异常出现的,调试程序的时候也捕获到了“由于目标机器积极拒绝......”的异常,但是就是没有抛出,程序直接停止调试退出了。请大家帮忙看看:部分代码如下:private static ManualResetEvent connectDone =new ManualResetEvent(false);“连接服务器”部分代码:
/// <summary>
/// 说明:开始连接
/// </summary>
/// <param name="strUserInfo"></param>
public string StartConnect(Packet sPacket)
{
try
{
IPAddress ipAddress = IPAddress.Parse("10.44.202.17");
int port = 19760;
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);  // 生成一个TCP/IP socket.
  Socket client = new Socket(AddressFamily.InterNetwork,
  SocketType.Stream, ProtocolType.Tcp);                
 // 与目标终端连接.
 client.BeginConnect(remoteEP,new AsyncCallback(ConnectCallback), client); connectDone.WaitOne();
}
catch (Exception exConnect)
{
     throw exConnect;
}
}ConnectCallback回调函数部分代码
private static void ConnectCallback(IAsyncResult ar)
        {            try
            {
                // 从state对象获取socket.
                Socket client = (Socket)ar.AsyncState;                // 完成连接.
                client.EndConnect(ar);            }
            catch (Exception ex) //调试时在此处可以捕获到异常的信息
            {
                throw ex; //执行完这句时程序就自动关闭了
            }
            // 连接已完成,主线程继续.
            connectDone.Set();
            
        }

解决方案 »

  1.   

    呃,这个异常是在回调函数中发生的,回调函数是另外的一个线程。
    .net2.0 以后,如果主线程以外的其他线程抛出异常没有处理,程序就是会终止,这个是.net framework自身就这样的。
      

  2.   

    哦,原来是这样啊,那应该怎么处理呢??总不能客户端一运行就关闭这个应该怎么做呢,请高手帮忙想下;throw ex; //执行完这句时程序就自动关闭了那这个地方应该怎么改,好让用户能有个友好的提示;
      

  3.   

    你可以设置 Application.ThreadException事件,这个事件会捕获到你抛出的异常,你可以在这里显示你的异常信息
      

  4.   

    AppDomain.CurrentDomain.UnhandledException 你用这个事件捕获其他线程的异常,
    但是并不能阻止这个异常结束程序,你只能在结束前给用户多一个友好的提示。
      

  5.   


    我的DEMO中有3个项目:第一个是Client(客户端):里面有个窗体界面(form1);第二个是Server(服务端):里面有个服务器端的窗体界面(from2);第三个是项目Test,把客户端和服务端的两个界面通过一个TabControl控件两个TabPages来控制显示;第一种情况:我把Client项目作为启动项;运行后在form1界面点击连接,抛出异常;程序也没有关闭;
    第二种情况:我把Test项目作为启动项;运行后在form1界面点击连接,不抛出异常;程序关闭了;
    不知道这是什么原因???(另外就是第一种情况也没有用Application.ThreadException事件或者AppDomain.CurrentDomain.UnhandledException 事件)???急切盼望解答;
      

  6.   

    呃。楼主还不明白么?
    总共有两种异常,一种是主线程(GUI那个线程)的异常,还有一种就是其他线程的异常。第一种异常,也就是主线程异常发生时,.net会跳出一个form,让你选择继续还是结束程序。
    第二种异常,其他线程的异常,只要你没有捕获,或者是捕获以后又抛出来了,.net就会直接结束程序,没有选择。楼主说的两种情况应该对应这两种异常
      

  7.   

    还想请教下:
    socket异步通信中如何一次通信交互多次啊,比如说
    (1)客户端发送一个数据包(加密后,密钥A)给服务端,
    (2)服务端收到后对数据包处理(加密,密钥B)后再返回给客户端;
    (3)此时客户端收到了新的数据包,对这个数据包解密(用密钥A解密);解密后再发给服务器端
    (4)服务器端收到新的数据包后用密钥B进行解密;此时得到的数据包就是客户端最原始的数据包;然后服务 端对数据的合法性进行验证后发一个确认给客户端;刚接触socket通信,很是纠结啊,看了些异步的socket代码,一次都是2个步骤通信:
    (1)客户端发送数据给服务端  
    (2)服务端收到数据后回发一个确认给客户端
    现在要怎么进行上面的4个步骤的通信呢???