我在说socket异步通讯时,作个一个类自己用,但在使用的时候发现一下的问题,请教各位了:
这个时客户端连接方法:方法在beginConnect后回调Connected方法
  public virtual void Connect(string ip, int port)
        {            Socket newsock = new Socket(AddressFamily.InterNetwork,
             SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port);
            try
            {
                newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
            }
            catch (ApplicationException EX)
            {
                throw (new ApplicationException("连接服务器失败!"));
            }        }
在Connected方法中实现如下:
    protected virtual void Connected(IAsyncResult iar)
        {            Socket socket = (Socket)iar.AsyncState;
            try
            {
                socket.EndConnect(iar);
            }
            catch
            {
                throw new ApplicationException("连接失败");
            }
            //创建新的会话
            _session = new Session(socket);
            _isConnected = true;
            //触发连接建立事件
            if (ConnectedServer != null)
            {
                ConnectedServer(this, new NetEventArgs(_session));
            }
            //建立连接后应该立即接收数据
            _session.ClientSocket.BeginReceive(_recvDataBuffer, 0,
             DefaultBufferSize, SocketFlags.None,
             new AsyncCallback(RecvData), socket);
        }
在socket.EndConnect(iar)处捕捉异常,也就是如果连不上服务器的话,这个地方抛出异常。
应用程序中:
             try
            {
               m_TcpCli.Connect(m_strServerIp, m_iPortNum);  
            }
            catch(Exception exx)
            {
                MessageBox.Show(exx.Message);
                return;
            }
但在程序运行过程中,不启动服务器而启动客户机连接,并没有捕获到那个socket.EndConnect(iar)处抛出的异常,平且显示如图:这是为什么,向大家学习学习。谢谢啦

解决方案 »

  1.   

    图不知道怎么搞的贴不上去,就是在
        try 
                { 
                    socket.EndConnect(iar); 
                } 
                catch 
                { 
                    throw new ApplicationException("连接失败"); 
                } 
    处报错,显示“为处理ApplicationException”
      

  2.   

    异步方法和普通方法的区别在于调用该方法后,该方法并不会阻塞当前线程,而是使用新线程来处理,因此当你调用该方法时,在调用后立即执行之后的代码。如下面这段例子:
    try
                {
                    //这个方法一调用后立即执行catch,除非传递的参数有误,否则将捕捉不到错误。
                    newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);     
                }
                catch (ApplicationException EX)
                {
                    throw (new ApplicationException("连接服务器失败!"));
                } 
      

  3.   

    问题是异步通讯的时候,当服务器没有打开时,BeginConnect()好像不能检测到连接失败,只能在异步调用函数Connected中的socket.EndConnect(iar); 
    这报错。怎么才能捕获这个异常呢?
      

  4.   

    异步的错误,一般在End方法处抛出。因此处理错误的打法应该是:
    try
    {
        //如果BeginMethod方法中存在错误,则调用本方法时,将会执出BeginMethod中的错误
        xxx.EndMethod(param);
    }
    catch (Exception ex)
    {
        //thorw your Exception
        ....
    }
      

  5.   

    这个我明白,beginConnect的错是在endConnect中报错,现在是这个endConnect是在另一个异步方法中调用的,怎么能让这个错抛出来
      

  6.   


    在End方法捕获就行。
    异步的概念就是调用的方法并不会阻塞当前线程,如果它阻塞了,那也不是异步了。
      

  7.   


    你可以在调用endConnect的方法中捕捉再抛出这个错误。
    或者
    可以定义一个ConnectError事件,在出现错误时,引发此事件。
      

  8.   

    谢谢kssys,我做了个ConnectError事件,可行。感谢Kssys的帮助